2015-01-26 4 views
0

에 점을 포함하여 노드 이름 구문 분석 방법 :SimpleXML을 : 나는 다음과 같은 XML을 구문 분석 할 필요가 XPath 쿼리

<BMECAT version="2005" xmlns="http://www.bmecat.org/bmecat/2005fd"> 
    <T_NEW_CATALOG prev_version="0"> 
     <PRODUCT> 
      <NAME>Test</NAME> 
      <USER_DEFINED_EXTENSIONS> 
       <UDX.VENDOR.ATTRIBUTE lang="de">German</UDX.VENDOR.ATTRIBUTE> 
       <UDX.VENDOR.ATTRIBUTE lang="en">English</UDX.VENDOR.ATTRIBUTE> 
      </USER_DEFINED_EXTENSIONS> 
     </PRODUCT> 
    </T_NEW_CATALOG> 
</BMECAT> 

나는 XPath를 통해 "독일어"값을 얻을 필요가있다. 지금까지 시도한 모든 것이 작동하지 않아 도움이 필요합니다. 문제는 태그 이름에 점들이 있다는 것입니다. 나는 xpath 표현식을 피할 수있는 방법을 찾지 못했습니다.

+0

제안 된 해결 방법을 시도해 보셨습니까? http://stackoverflow.com/questions/6531380/php-simplexml-with-dot-character-in-element-in-xml? –

+0

결과로 시도한 xpath 쿼리 중 일부를 표시 할 수 있습니까? – jazZRo

+0

@jazZRo 글쎄, 분명히 그 안에'.'이있는 표현식입니다. 제 생각에는 문제가 이미 분명합니다. –

답변

1

XML 형식이 잘못되었으므로 구문 분석 할 수 없습니다 (USER_DEFINED_EXTENSIONS이 제대로 닫히지 않음). 잘 구성된 입력을 가정 할 때, 대신 SimpleXML을의있는 DOMDocument을 사용할 수

<?php 
$xml = <<<'XML' 
<BMECAT version="2005" xmlns="http://www.bmecat.org/bmecat/2005fd"> 
    <T_NEW_CATALOG prev_version="0"> 
     <PRODUCT> 
      <NAME>Test</NAME> 
      <USER_DEFINED_EXTENSIONS> 
       <UDX.VENDOR.ATTRIBUTE lang="de">German</UDX.VENDOR.ATTRIBUTE> 
       <UDX.VENDOR.ATTRIBUTE lang="en">English</UDX.VENDOR.ATTRIBUTE> 
      </USER_DEFINED_EXTENSIONS> 
     </PRODUCT> 
    </T_NEW_CATALOG> 
</BMECAT> 
XML; 

$dom = new DOMDocument(); 
$dom->loadXML($xml); 

$xpath = new DOMXPath($dom); 
$xpath->registerNamespace("bme", 
     "http://www.bmecat.org/bmecat/2005fd"); 

$expression = 'string(
    /bme:BMECAT 
    /bme:T_NEW_CATALOG 
    /bme:PRODUCT 
    /bme:USER_DEFINED_EXTENSIONS 
    /bme:UDX.VENDOR.ATTRIBUTE[@lang = "de"] 
)'; 

var_dump($xpath->evaluate($expression)); 

을 그리고 당신은 SimpleXML을을 사용해야 할 경우 결과가

German 

될 것입니다, 당신은 정말 당신의 현재 PHP 코드를 표시해야합니다.

+0

죄송합니다. 누락 된 닫기 태그는 단지 복사 및 붙여 넣기 오류였습니다. DOMDocument 사용에 감사드립니다. 나는 그것을 시도해보고 아마도 SimpleXML 대신 그것을 사용할 것이다. 감사! – Thomas

+0

다음과 같이 텍스트 내용을 직접 가져올 수 있습니다 :'$ xpath-> evaluate ("string (/bme:BMECAT/bme:T_NEW_CATALOG/bme:PRODUCT/bme:USER_DEFINED_EXTENSIONS/bme:UDX.VENDOR.ATTRIBUTE [@lang = 'de ']) ";'루프가 필요 없습니다 :-) – ThW

+0

@ThW Thanks Thomas! 나는 당신이 볼 수있는 PHP에 정통하지 않다.). –