2017-10-17 210 views
1

我遇到了一個我無法解決的問題。我使用DOMXPath檢索MsgId標籤下面的XML文件中的值:DOMXPath - 獲取節點

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

以下是我的PHP代碼片段來查詢與DOMXPath的XML:

$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 

我測試與此tool查詢,它似乎是正確的。

有沒有人有一個想法,爲什麼xpath表達式在這種情況下不起作用?我在這裏錯過了一些細節嗎?

回答

2

$groupHeaderXPath的類型爲DOMXPath,它有一個方法registerNamespace

我認爲這將有助於註冊名稱空間並在xpath表達式中使用前綴'urn'。

例如:

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

這就是問題。如果刪除名稱空間,它將正常工作,因爲所有內容都位於默認名稱空間中。 – prodigitalson

+0

謝謝它完美的作品:) – BwaBwa