2017-05-21 21 views
0

単純なXMLでノードを取得しようとしていますが、何を試しても常にnullが返されます。XPathを使用してXMLノードを取得するとnullが返される

私は問題が名前空間であると推測しています。

私は単純にXMLが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); 

ID要素の値を取得しようとしています:

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

    ... 

答えて

0

あなたは、正確な名前空間を指定する必要があります。

また、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"; 

これは動作するはずです。

+0

ありがとう:-)。それは素晴らしい作品です。しかし、あなたの "nsDoc"と "nsInvoce"はどんな名前でもかまいません。だから私はnamespeceがXMLのどこでも使われているかと思いますが、xpathが動作するためには、それをどこでも使う必要があります。 – dlilleaa

+0

はい、任意の名前を使用できます。 'cbc'と同様に。 –

関連する問題