0

php SimpleXML と xpath を使用して XML ファイルを解析しようとしていますが、パスを正しく取得して属性値にアクセスする際に問題があります。どんな助けでも感謝します。

ここに私のxmlファイルがあります:-

<message:MessageGroup xmlns="http://mynamespace.com">
<Book>
<BookKey>
<Value concept="TITLE" value="Gone Girl"/>
<Value concept="AUTHOR" value="Gillian Flynn"/>
</BookKey>
<Sales>
<Month>Jan</Month>
<Number value="20"/>
</Sales>
<Sales>
<Month>Feb</Month>
<Number value="15"/>
</Sales>
<Sales>
<Month>Mar</Month>
<Number value="30"/>
</Sales>
</Book>
<Book>
<BookKey>
<Value concept="TITLE" value="Inferno"/>
<Value concept="AUTHOR" value="Dan Brown"/>
</BookKey>
<Sales>
<Month>Jan</Month>
<Number value="10"/>
</Sales>
<Sales>
<Month>Feb</Month>
<Number value="15"/>
</Sales>
<Sales>
<Month>Mar</Month>
<Number value="3"/>
</Sales>
</Book>
</message:MessageGroup>

次の出力を取得するには、これを解析する必要があります:-

Gone Girl,Gillian Flynn,Jan,20
Gone Girl,Gillian Flynn,Feb,15
Gone Girl,Gillian Flynn,Mar30
Inferno,Dan Brown,Jan,10
Inferno,Dan Brown,Feb,15
Inferno,Dan Brown,Mar,3

私は次のコードを書きました:-

<?php
$xmlfile = 'Books.xml';
$xml = simplexml_load_file($xmlfile);
$namespace = 'http://mynamespace.com';
$xml->registerXPathNamespace('ns',$namespace);
$books = $xml->xpath('//ns:Book');

//loop through each book -

foreach($books as $book) {

$values = $xml->xpath('ns:BookKey/Value');
$bookkeys= array();

//loop through each Book's BookKey Values and push them to array -

foreach($values as $value){  
array_push($bookkeys, $value->attributes()->value);
}    
$sales = $xml->xpath('ns:Sales');

//loop through each Book's Sales and write out Month and Number value after the book key values -

foreach($sales as $sale){  
foreach($bookkeys as $bk){
echo $bk.",";
}
echo $sale->Month;
echo ",";
echo $sale->Number->attributes()->value;
echo "\n";
}
}
?>

var_dump から、$books 配列は問題ないように見えます。ただし、$values と $sales は空の配列であるため、明らかにパスが正しくありません。名前空間を除外しようとしましたが、まだ空の配列を取得しています。特定の書籍ごとのインスタンスだけを抽出するのではなく、ファイル内の値と売上のすべてのインスタンスを抽出することは避けたいと考えています。

4

1 に答える 1

1

接頭辞 のネームスペース定義がありませんmessage

valuefromを取得するにはValuemessage:MessageGroup/ns:BookKey/ns:Value/@value使用する XPath になります。

于 2013-04-26T16:40:53.780 に答える