我怎样才能使用XML Serializable命名空间前缀?

时间:2015-02-02 01:27:10

标签: c# serializable ixmlserializable

这是XML

<NS1:Response xmlns:NS1="http://www.opentravel.org/OTA/2003/05">
     <DATE CheckIn="2015-02-01"/>
</NS1:Response>

这是模型

[Serializable]
[XmlRoot(ElementName = "Response")]
public class Response
{
    [XmlElement(ElementName = "DATE")]
    public DATE DATE {get;set;}

    public class DATE
    {
        [XmlAttribute(AttributeName = "CheckIn")]
        public string CheckIn {get;set;}
    }
}

如何在模型中添加NS1命名空间前缀? 请建议我。 非常感谢你。

2 个答案:

答案 0 :(得分:2)

在我解释如何做你想做的事情之前,重要的是要意识到XML阅读器/解析器通常不关心你在你的元素上添加什么前缀;他们只关心完整命名空间

换句话说,当您加载示例XML片段时,ns1位将被完全丢弃。在内部,您获得的是XML命名空间/元素对,如("http://www.opentravel.org/OTA/2003/05", "Response")("http://www.opentravel.org/OTA/2003/05", "Date")。知道这一点很重要的原因是因为您可以将不同的名称空间前缀分配给XML数据,以供XML数据使用。 XPath,它会正常工作。也就是说,我可以将XML片段读入我的程序,并说"http://www.opentravel.org/OTA/2003/05"应该映射到前缀"t",并使用像//t:Response这样的XPath来获得正确的结果,即使源XML数据没有t前缀。

换句话说,你真的,真的不应该试图在XML中获得特定的 XML名称空间前缀,因为它无关紧要。如果有一个特定的前缀对于一切正常工作是必要的,那么某个地方的人正在做一些非常错误的事情。

话虽如此,如果由于某种原因你需要输出特定的名称空间前缀,或者你恰好喜欢它们的外观,你可以使用XmlSerializerNamespaces类,如下所示:

var ns = new XmlSerializerNamespaces(); 
ns.Add("NS1", "http://www.opentravel.org/OTA/2003/05");

var s = new XmlSerializer(typeof(Response));
var output = new StreamWriter(SOME_FILENAME);

s.Serialize(response, output, ns);

为此,您还必须使用您希望它们所在的完整命名空间来装饰您的类。所有XML Serializer属性都有一个Namespace参数用于这个目的,例如:

[XmlRoot(ElementName = "Response",
         Namespace = "http://www.opentravel.org/OTA/2003/05")]
public class Response
{
}

序列化对象时,序列化程序将在命名空间映射中查找命名空间,并将您选择的前缀应用于相应的元素。

答案 1 :(得分:0)

命名空间前缀在XML中无关紧要。分配给前缀的命名空间是密钥。

您可以使用XmlRoot属性来分配命名空间。

[Serializable]
[XmlRoot(ElementName = "Response", 
         Namespace = "http://www.opentravel.org/OTA/2003/05")]
public class Response