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

时间:2019-05-23 19:45:01

标签: c# xml parsing

我有一个像上面一样的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属性。我无法解决问题。

1 个答案:

答案 0 :(得分:0)

文档的默认命名空间是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。