【问题标题】:How can I XML Serializable namespace prefixes?如何使用 XML 可序列化命名空间前缀?
【发布时间】:2015-03-31 22:32:28
【问题描述】:

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

【问题讨论】:

    标签: c# serializable ixmlserializable


    【解决方案1】:

    在我解释如何做你想做的事之前,重要的是要认识到 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 来获得正确的结果,即使源 XML 数据没有 @ 987654330@前缀。

    换句话说,您真的,真的不应该费心尝试将 特定 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 序列化器属性都有一个用于此目的的 Namespace 参数,例如:

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

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

    【讨论】:

    • 我尝试将 XmlSerializerNamespaces 添加为 thors xml 序列化程序,但是对于不使用 Serializable 属性但它们派生自 IXmlSerializable 接口的类型,编写前缀不起作用。
    • 使用 IXmlSerializable 接口,我相信您可以在根元素上使用“writeattributestring”手动发出命名空间定义,然后在写出元素时包含它们。见:stackoverflow.com/questions/7575218/…
    • @Michal Endelfield 写属性允许我写像 xmlns:NS1="opentravel.org/OTA/2003/05" 这样的属性,但是 attribute is not a prefix ,见stackoverflow.com/questions/51590112/…
    • 我不确定你在问什么;您是否阅读了我链接的问题的答案?在文档的根元素中,前缀 一个属性(具有特殊格式),WriteElementString() 允许您为每个元素指定命名空间和命名空间前缀。
    • 从您手动链接写作属性的示例中,可以创建 ,但我需要创建 ,写属性是不可能的。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-21
      • 2013-05-02
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多