简体   繁体   中英

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

I have an xml beginning like above

<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>

        <!-- ... -->

and I try to parse the xml with method like that

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

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

and my xml model is like above

[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; }
    // ...
}

However, I cannot parse the xml document, all values come null. I think that it is because of multiple xmlns attribute in Invoice tag. I couldnt solve the problem.

The default namespace of the document is urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 which you have correctly put in the XmlRoot , but the child elements such as UBLVersionID are prefixed with cbc , which is a different namespace. You have to put that namespace against the property to let the serializer know that's what it is.

For example:

[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; }
    // ...
}

In Visual Studio, you can use Edit > Paste Special > Paste Xml As Classes to see how to decorate a class to match your XML if you're in doubt.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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