XML 序列化 + 命名空间 (C#)

Posted

技术标签:

【中文标题】XML 序列化 + 命名空间 (C#)【英文标题】:XML Serialization + Namespaces (C#) 【发布时间】:2012-06-17 23:06:56 【问题描述】:

我需要生成这样的东西:

<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
<Header>
...
</Header>
</AmazonEnvelope>

我正在尝试这样的事情,但它并不完全正确:

XmlSerializerNamespaces nms = new XmlSerializerNamespaces();
        nms.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
        nms.Add("noNamespaceSchemaLocation", "amzn-envelope.xsd");



        XmlSerializer serializer = new XmlSerializer(typeof(XMLAmazonEnvelope));
        StreamWriter writer = new StreamWriter(path);

        serializer.Serialize(writer, objectToSave,nms);
        writer.Close();

结果是:

<?xml version="1.0" encoding="utf-8"?>
<xsi:AmazonEnvelope xmlns:noNamespaceSchemaLocation="amzn-envelope.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsi:Header>
...
</xsi:Header>
</xsi:AmazonEnvelope>

这并不是我想要的。 有什么想法,应该做些什么不同的事情?

【问题讨论】:

xsi:noNamespaceSchemaLocation="amzn-envelope.xsd" 不是命名空间声明。您必须在 xsi 命名空间中将属性 noNamespaceShcemaLocation 添加到 AmazonEnvelope 元素,但除非您有权访问 @987654329 的源代码,否则我在文档中看不到直接的方法@。在这种情况下,您可以向使用 [XmlAttribute] 注释的类添加一个字段/属性,名称为 noNamespaceSchemaLocation 和您想要的值。 或者也许可以通过使用 XmlAttributeOverrides 访问源代码,但我不知道该 API 是如何工作的。 XmlAttribute 只允许字段、属性、索引,我有: [XmlRoot(ElementName = "AmazonEnvelope", Namespace = "w3.org/2001/XMLSchema-instance")] [XmlAttribute(AttributeName="noNamespaceSchemaLocation")] 公共类 XMLAmazonEnvelope private ObservableCollection _Messages = new ObservableCollection( ); [XmlElement(ElementName="Header")] public XMLHeader Headerget;set; .... 因此将[XmlAttribute(AttributeName="noNamespaceSchemaLocation")] 附加到值为"amzn-envelope.xsd" 的字符串字段。 (并在属性中使用正确的命名空间。) 【参考方案1】:

这里已经解决了问题:

How to add xml namespaces (Amazon Envelope)

【讨论】:

以上是关于XML 序列化 + 命名空间 (C#)的主要内容,如果未能解决你的问题,请参考以下文章

C# 使用多个可能的命名空间反序列化 xml

在不修改 C# XSD 类的情况下向 XML 序列化添加前缀和命名空间

XML 序列化和命名空间前缀

c# XmlSerializer 反序列化器缺少默认命名空间

C# XmlSerializer 用不同的命名空间序列化同一个类

由于命名空间而无法反序列化 xml