2014-07-09 2 views
0

는 다음과 같은 XML을 감안할 때 :PHP의 SimpleXML 확장 기능을 사용하여 XML 트리를 탐색하는 방법은 무엇입니까?

$xmlstr = <<<XML 
<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <DataService xmlns="http://www.example.com"> 
     <Response> 
     <XMLRootNode xmlns="http://www.example.com"> 
      <ResponseHeader> 
      <Version>2.0</Version> 
      <RecordCount>2</RecordCount> 
      </ResponseHeader> 
      <OnlineInformation BoothID="12345"> 
      <EventID>4</EventID> 
      ... 

어떻게 PHP의 SimpleXML을 확장을 사용 EventID의 내용을 액세스 할 수 있습니까? 나는 간단한 예제 양식 here으로 성공을 거두었지만 위의 더 복잡한 트리 구조를 탐색 할 수는 없습니다. 내 기본 코드는 아래와 같습니다. 나는 값 4.

$data = new SimpleXMLElement($xmlstr); 

$output = $data->... 

감사를 포함 $output를 원한다.

+2

가 인 print_r ($ 데이터) 다음 데이터가 해당 개체에 어떻게 구성되어 있는지 알아낼 수있는 일을하려고이처럼. – Cristian

+0

'$ data'가 객체이기 때문에'var_dump ($ data)'에 더 낫습니다. – Raptor

+1

직관적으로 :'$ soap : Body '} -> DataService-> Response-> XMLRootNode-> OnlineInformation-> EventID;'나에게 맞는 것처럼 보이지만 오류가 발생한다'속성을 얻으려고한다. 비 개체 '의. – 24ma13wg

답변

0

또는 DOMDocument 수 있습니다.

// your incomplete xml sample 
$xmlstr = <<<XML 
<?xml version="1.0" encoding="utf-8"?> 
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
     <DataService xmlns="http://www.example.com"> 
     <Response> 
      <XMLRootNode xmlns="http://www.example2.com"> 
      <ResponseHeader> 
       <Version>2.0</Version> 
       <RecordCount>2</RecordCount> 
      </ResponseHeader> 
      <OnlineInformation ExampleID="12345"> 
       <EventID>4</EventID> 
      </OnlineInformation> 
      </XMLRootNode>  
     </Response> 
     </DataService> 
    </soap:Body> 
    </soap:Envelope> 
XML; 

$dom = new DOMDocument(); 
$dom->loadXML($xmlstr); 
foreach($dom->getElementsByTagName('OnlineInformation') as $OnlineInformation) { 
    if($OnlineInformation->getAttribute('ExampleID') == 12345) { 
     echo $OnlineInformation->getElementsByTagName('EventID')->item(0)->nodeValue; 
     // 4 
    } 
} 

또는 단지를 가리 직접 xpath를 사용 :

$xml = simplexml_load_string($xmlstr); 
$xml->registerXPathNamespace('ns', 'http://www.example2.com'); 
$node = $xml->xpath('//ns:OnlineInformation[@ExampleID="12345"]')[0]; 
echo (string) $node->EventID; // 4 
+0

고마워,이 후속을 위해 몇 가지 아이디어를 주었다. – 24ma13wg

관련 문제