【问题标题】:Getting XML node using XPath returns null使用 XPath 获取 XML 节点返回 null
【发布时间】:2017-10-21 04:51:50
【问题描述】:

我试图在一个简单的 XML 中获取一个节点,但无论我尝试什么,我总是得到 null。

我猜是命名空间的问题。

我只是想获取 ID 元素的值 331377697。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("E:\\0323.xml");

XmlNamespaceManager manager = new XmlNamespaceManager(xmlDoc.NameTable);
manager.AddNamespace("cac", "http://xxxxxx Some URL XXXX");
manager.AddNamespace("cbc", "http://xxxxxx Some URL XXXX");

string query = "/StandardBusinessDocument/Invoice/cbc:ID";

XmlNode xmlNode = xmlDoc.SelectSingleNode(query, manager);

XML:

<StandardBusinessDocument xmlns="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader">
      <StandardBusinessDocumentHeader>
      ...
      </StandardBusinessDocumentHeader>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ccts="urn:un:unece:uncefact:documentation:2"
...
</Invoice>
    <cbc:UBLVersionID>2.1</cbc:UBLVersionID>
    <cbc:CustomizationID>1234</cbc:CustomizationID>
    <cbc:ProfileID>1234564</cbc:ProfileID>
    <cbc:ID>331377697</cbc:ID>
    <cbc:IssueDate>2017-03-23</cbc:IssueDate>
    <cbc:InvoiceTypeCode listID="UNCL1001">380</cbc:InvoiceTypeCode>
    <cbc:DocumentCurrencyCode listID="ISO4217">NOK</cbc:DocumentCurrencyCode>
    <cac:OrderReference>
        <cbc:ID>146136</cbc:ID>
    </cac:OrderReference>

    ...

【问题讨论】:

    标签: c# xml xpath xml-namespaces xmldocument


    【解决方案1】:

    您必须指定确切的命名空间。

    您还必须为 XPath 中的所有元素指定命名空间前缀。

    manager.AddNamespace("nsDoc", "http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader");
    manager.AddNamespace("nsInvoice", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2");
    manager.AddNamespace("cbc", "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2");
    
    string query = "/nsDoc:StandardBusinessDocument/nsInvoice:Invoice/cbc:ID";
    

    它应该可以工作。

    【讨论】:

    • 谢谢你:-)。它工作得很好。但是您的“nsDoc”和“nsInvoce”可以是任何名称,对吧?所以我猜如果在 XML 的任何地方都使用了 namespece,你需要在每个地方都使用它,这样 xpath 才能工作。
    • 是的,它可以是任何名称。还有cbc。
    猜你喜欢
    • 2016-02-23
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    相关资源
    最近更新 更多