2016-10-03 4 views
0

XMLファイルの特定の部分を抽出できません。XMLReaderとxmlreader-iterators.phpでXPathを重複したノードを持つドキュメントに使用する

は、この例のXMLを取る:

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

私は、この大規模なドキュメントを横断し、「対策」という名前されているノードのみを読み取るためにPHPのXMLReader(https://gist.github.com/hakre/5147685)のためのイテレータを使用しています。残念ながら、ドキュメントには「対策」も含まれる第2セクションがあります。その上に、ユーザー定義のメジャーと非ユーザー定義のメジャーがありますが、私は '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++; 
    } 
} 

をしかし、私はちょうど「対策」の中から対策をピックアップするIteratorを絞り込むことができていない部分。それでも "トランザクション"セクションが表示されます。

答えて

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

ありがとうございます! –

関連する問題