繁体   English   中英

如何使用XML可序列化的名称空间前缀?

[英]How can I XML Serializable namespace prefixes?

这是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命名空间前缀? 请建议我。 非常感谢你。

在我解释如何做你想做的事情之前,重要的是要认识到XML读取器/解析器通常并不关心在元素上使用的前缀是什么。 他们只关心完整的名称空间

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

序列化对象时,序列化程序将在名称空间映射中查找名称空间,并将所选的前缀应用于适当的元素。

名称空间前缀在XML中无关紧要。 分配给前缀的名称空间是键。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM