2017-10-17 3 views
1

해결할 수없는 문제가 있습니다. 나는 다음과 같은 XML 파일의 MsgId 태그의 값을 검색 할 DOMXPath을 사용하고 있습니다 :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> 

다음 DOMXPath와 XML 쿼리 내 PHP 코드 조각입니다 :

$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

$groupHeaderXPathDOMXPath이고, 방법은 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