2017-10-17 1 views
1

Ich stehe vor einem Problem, das ich nicht lösen kann. Ich verwende DOMXPath den Wert von MsgId Tag der folgenden XML-Datei abzurufen:DOMXPath - Get Node

<?xml version="1.0" encoding="UTF-8"?> 
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <CstmrCdtTrfInitn> 
     <GrpHdr> 
      <MsgId>Test/20171013/CCT100621</MsgId> 
      <CreDtTm>2017-10-13T10:06:21</CreDtTm> 
      <NbOfTxs>62</NbOfTxs> 
     </GrpHdr> 
    </CstmrCdtTrfInitn> 
</Document> 

Das folgende ist mein PHP-Code-Snippet die XML mit DOMXPath abfragen:

$xml = <<<XML 
    <?xml version="1.0" encoding="UTF-8"?> 
    <Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <CstmrCdtTrfInitn> 
      <GrpHdr> 
       <MsgId>Test/20171013/CCT100621</MsgId> 
       <CreDtTm>2017-10-13T10:06:21</CreDtTm> 
       <NbOfTxs>62</NbOfTxs> 
      </GrpHdr> 
     </CstmrCdtTrfInitn> 
    </Document> 
XML; 

$document = new DOMDocument; 
$document->loadXML($xml); 
$groupHeaderXPath = new DOMXPath($document); 
echo $groupHeaderXPath->query('//GrpHdr/MsgId')->length; // returns 0 

Ich teste die Abfrage mit diesem tool und es scheint, dass es korrekt ist.

Hat jemand eine Idee, warum der XPath-Ausdruck in diesem Kontext nicht funktioniert? Fehle ich hier einige Details?

Antwort

2

$groupHeaderXPath ist vom Typ DOMXPath, der eine Methode registerNamespace hat.

Ich denke, es wäre hilfreich, den Namespace zu registrieren und das Präfix "Urn" in Ihrem Xpath-Ausdruck zu verwenden.

Zum Beispiel:

$rootNamespace = $document->lookupNamespaceUri($document->namespaceURI); 
$groupHeaderXPath->registerNamespace("urn", $rootNamespace); 
echo $groupHeaderXPath->query('//urn:GrpHdr/urn:MsgId')->length; // returns 1 
+0

Das ist das Problem. Wenn Sie den Namespace entfernen, funktioniert das problemlos, da sich alles im Standardnamespace befindet. – prodigitalson

+0

Danke, es funktioniert perfekt :) – BwaBwa