2016-10-03 4 views
0

XML 파일의 특정 부분을 추출하는 데 문제가 있습니다. 중복 노드가있는 문서에서 XMLReader 및 xmlreader-iterators.php와 함께 XPath 사용

이 예제 XML을 가지고 :이 큰 문서를 탐색하고 '측정'라는 이름 만 노드를 읽어 PHP의 XMLReader ( https://gist.github.com/hakre/5147685)에 대한 반복자를 사용하고

<toplevel> 
<profile> 
    <technology type="java" /> 
    <technology type="dotnet" /> 
    <technology type="sdk" /> 
    <technology type="webserver" /> 
    <license interactive="false" /> 
    <groups></groups> 
    <sensors></sensors> 
    <measures> 
    <measure id="example-name1" userdefined="true"></measure> 
    <measure id="example-name2" userdefined="false"></measure> 
    </measures> 
    <transaction> 
    <value> 
    <measure id="example-name3" userdefined="true"></measure> 
    </value> 
    </transaction> 
</profile> 
</toplevel> 

. 불행히도 문서에 두 번째 섹션에는 '측정 값'이 포함되어 있습니다. 그 위에 사용자 정의 및 비 사용자 정의 측정 값이 있으며 'userdefined = "true"'측정 만 원합니다.

내 코드는 지금까지 있습니다 :

require('xmlreader-iterators.php'); 
$xmlFile = "../xml/measures.xml"; 

$readerMeasures = new XMLReader(); 
$readerMeasures->open($xmlFile); 
$dataMeasures = array(); 

$measures = new XMLElementIterator($readerMeasures, 'measure'); 
foreach ($measures as $measure) { 
    $item = $measure->getAttribute('id'); 
    array_push($dataMeasures, $item); 
} 

누군가가 나에게 '조치'섹션 내에서 정의 된 사용자를 단지 조치를 내 결과를 좁힐하는 방법을 이해하는 데 도움시겠습니까? XPath로이 작업을 수행 할 수 있습니까?

감사합니다.

편집 : 사용자 정의 부분을 정리 한

:

foreach ($measures as $measure) { 
    $userdefined = $measure->getAttribute('userdefined'); 
    $measure_name = $measure->getAttribute('id'); 
    if ($userdefined=="true") { 
    echo "$measure_name<br>"; 
    $count++; 
    } 
} 

을하지만 난 그냥 "조치"내에서 조치를 데리러 반복자를 좁힐 수 없었다 섹션 . 여전히 "transactions"섹션을보고 있습니다.

답변

1

여기에서는 반복기가 필요하지 않습니다. 당신은 SimpleXMLXPath으로 이것을 달성 할 수 있습니다.

이로 간단하게 요소를 선택합니다 :

$xml = new SimpleXMLElement($xml); 

$measures = $xml->xpath('//measures/measure[@userdefined="true"]'); 

는 그런 다음 선택한 항목 이상 반복 할 수 있습니다 여기에

foreach ($measures as $measure) { 
    echo 'id: ', $measure['id'], PHP_EOL; 
    echo 'value: ', $measure, PHP_EOL; 
    echo PHP_EOL; 
} 

working demo입니다.

+0

감사합니다. –