繁体   English   中英

如何在C#中解析具有多个xmlns属性的xml?

[英]How to parse xml with multiple xmlns attribute in c#?

我有一个像上面一样的xml开头

<Invoice 
    xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2../xsdrt/maindoc/UBL-Invoice-2.1.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xades="http://uri.etsi.org/01903/v1.3.2#"
    xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
    xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
    xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" 
    xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">

        <cbc:UBLVersionID>2.1</cbc:UBLVersionID>
        <cbc:CustomizationID>TR1.2</cbc:CustomizationID>
        <cbc:ProfileID>TEMELFATURA</cbc:ProfileID>
        <cbc:ID>ALP2018000007216</cbc:ID>

        <!-- ... -->

我尝试用这样的方法解析xml

public static T FromXml<T>(string xmlString)
{
    StringReader xmlReader = new StringReader(xmlString);
    XmlSerializer deserializer = new XmlSerializer(typeof(T));

    return (T)deserializer.Deserialize(xmlReader);
}

我的xml模型就像上面

[Serializable]
[XmlRoot(
    Namespace = "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2", 
    ElementName = "Invoice", 
    DataType = "string", 
    IsNullable = true)]
public class Invoice
{
    public string CustomizationID { get; set; }
    // ...
}

但是,我无法解析xml文档,所有值都为null。 我认为这是因为Invoice标签中有多个xmlns属性。 我无法解决问题。

文档的默认名称空间是urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ,您已经正确地将其放置在XmlRoot ,但是诸如UBLVersionID之类的子元素以cbc为前缀,这是另一个名称空间。 您必须将该名称空间放在属性上,以让序列化程序知道它是什么。

例如:

[Serializable]
[XmlRoot(
    Namespace = "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2",
    ElementName = "Invoice",
    DataType = "string",
    IsNullable = true)]
public class Invoice
{
    [XmlElement(Namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2")]
    public string CustomizationID { get; set; }
    // ...
}

在Visual Studio中,如果有疑问,可以使用“编辑”>“选择性粘贴”>“将Xml作为类粘贴”来查看如何修饰类以匹配XML。

暂无
暂无

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

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