【发布时间】:2016-07-14 19:02:30
【问题描述】:
TLDR 版本
我将对象序列化为 XML 以匹配第三方提供的模式。他们的验证器要求其中一个子对象具有显式声明的名称空间,该名称空间与其祖先的名称空间相匹配。数据足够复杂,我不想为此目的推出自己的序列化程序。如何强制 XMLSerializer 类显式呈现命名空间,即使它在技术上是多余的?
完整版
我遇到了 XMLSerializer 未呈现 CoreItemsMkt 命名空间的问题。我相信这是因为属性和命名空间都与它所继承的祖先命名空间完全匹配,因此序列化程序会忽略它 - 但是,提交此文件的站点验证器需要它。
例如:
<?xml version="1.0" encoding="utf-8"?>
<FSAMarketsFeed xmlns="http://www.fsa.gov.uk/XMLSchema/FSAMarketsFeed-v1-2">
<FSAFeedHeader xmlns="http://www.fsa.gov.uk/XMLSchema/FSAFeedCommon-v1-2">
[...contents omitted, this item appears once...]
</FSAFeedHeader>
<FSAMarketsFeedMsg>
<CoreItemsMkt xmlns="http://www.fsa.gov.uk/XMLSchema/FSAMarketsFeed-v1-2"> <!--//This namespace is the issue//-->
[...contents omitted, this item appears multiple times...]
</CoreItemsMkt?
</FSAMarketsFeedMsg>
<FSAMarketsFeedMsg>
<CoreItemsMkt xmlns="http://www.fsa.gov.uk/XMLSchema/FSAMarketsFeed-v1-2"> <!--//This namespace is the issue//-->
[...contents omitted, this item appears multiple times...]
</CoreItemsMkt?
</FSAMarketsFeedMsg>
我正在使用这样的方法进行序列化:
var path = GetFilePath();
var ns = new XmlSerializerNamespaces();
ns.Add("", "http://www.fsa.gov.uk/XMLSchema/FSAMarketsFeed-v1-2");
var ser = new XmlSerializer(typeof(FSAMarketsFeed));
var settings = new XmlWriterSettings
{ Encoding = Encoding.UTF8, Indent = true, IndentChars = "\t", NamespaceHandling = NamespaceHandling.Default };
using (var writer = XmlWriter.Create(path, settings))
{
ser.Serialize(writer, GetDataToSerialize(), ns);
}
我的根类定义为:
[XmlType(AnonymousType = true)]
[XmlRoot(Namespace = "http://www.fsa.gov.uk/XMLSchema/FSAMarketsFeed-v1-2", IsNullable = false)]
public class FSAMarketsFeed
{
public FSAMarketsFeed()
{
FSAMarketsFeedMsg = new FSAMarketsFeedMsg[0];
}
[XmlElement("FSAFeedHeader", IsNullable = true, Namespace = "http://www.fsa.gov.uk/XMLSchema/FSAFeedCommon-v1-2")]
public FSAFeedHeader FeedHeader { get; set; }
[XmlElement("FSAMarketsFeedMsg")]
public FSAMarketsFeedMsg[] FSAMarketsFeedMsg { get; set; }
}
工作提要标题类:
[XmlType(AnonymousType = true)]
public class FSAFeedHeader
{
[XmlElement("FeedTargetSchemaVersion", IsNullable = true)]
public string FeedTargetSchemaVersion { get; set; }
[XmlElement("Submitter", IsNullable = true)]
public Submitter Submit { get; set; }
[XmlElement("ReportDetails", IsNullable = true)]
public ReportDetails ReportDetail { get; set; }
}
父 Feed 消息类:
[XmlType(AnonymousType = true)]
public class FSAMarketsFeedMsg
{
[XmlElement("CoreItemsMkt", IsNullable = true, Namespace = "http://www.fsa.gov.uk/XMLSchema/FSAMarketsFeed-v1-2")]
public CoreItemsMkt CoreMarket { get; set; }
[XmlElement("Transaction", IsNullable = true)]
public Transaction Trans { get; set; }
}
最后,未能呈现其命名空间的 CoreItemsMkt 类:
[XmlType(Namespace = "http://www.fsa.gov.uk/XMLSchema/FSAMarketsFeed-v1-2", AnonymousType = true)]
public class CoreItemsMkt
{
//[... Children omitted ...]]
}
到目前为止尝试过:
- 使用 XMmlType(AnonymousType = true) 尝试打破继承链
- 将 xmlns 显式设置为带有硬编码值的 XmlAttributeAttribute。
- 在 CoreItemsMkt 上设置和删除 XmlType(Namespace = "http://www.fsa.gov.uk/XMLSchema/FSAMarketsFeed-v1-2")
- 在 FSAMArketsFeedMsg 的属性上添加和删除 XmlElement(Namespace = "the value")。
- 在 CoreItmsMkt 上实现 ISerializable(虽然不太清楚如何让它工作。)
- 堆栈溢出搜索 - 我发现 1 个类似问题的答案是“不支持,请更改您的输出命名空间”。不幸的是,这个答案对我不起作用。
那么,在不手动渲染的情况下,有没有办法强制 XmlSerializer 类在 CoreItmsMkt 上渲染这些命名空间属性?
【问题讨论】:
-
只是为了确认,通过明确声明的模式与它的祖先的模式匹配,您的意思是明确声明的命名空间与它的祖先的命名空间?
-
@dbc... 是正确的。对不起,在这个和一个 SQL 项目之间来回走动。稍后将进行编辑以更正。
标签: c# xml serialization xml-namespaces xmlserializer