人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPのxpathについて
「PHPでXPath を使用する」を勉強しています。
https://www.ibm.com/developerworks/jp/xml/library/x-xpathphp/

上記サイトのproducts.xmlを対象に、
「リスト 2. SimpleXML を使用し、すべてのノードを配列として表示する」
はそのままできるのですが、

「リスト 3. SimpleXML を使用し、すべての製品名を配列として表示する」
<?php
$xml = simplexml_load_file("products.xml");
$products = $xml->xpath("/PRODUCTS/PRODUCT/NAME");
print_r($products);
?>
*$products = $xml->xpath("/PRODUCTS/PRODUCT/NAME");
の部分が違うだけです。

だと、配列に何もはいりません。
Array ( [0] => SimpleXMLElement Object ( )
*この状態が、[0]?[3]まで表示

何が悪いのかわかりません。
教えていただけると大変助かります。

よろしくお願いします。

●質問者: kohhi
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● tezcello
●100ポイント

単純にIBMのページの内容が正しくない(あるいは今のバージョンとは応答が違う)のだろうと思います。
__ミスもあるようですしね
__[SKU='soft5678'] で Pro Reporting が得られるみたいな記述だけど
__「Pro Reporting」は SKUが soft32323 だし(というか soft5678 は存在しない)


> Array ( [0] => SimpleXMLElement Object ( )
良く考えてみれば、これで良いんじゃないでしょうか?

xpath() の戻り値 $products は単なる配列で $products[0] は SimpleXMLElement。
$products[0] は何らかのプロパティやノードを含んでいる訳ではないので $product[0] は SimpleXMLElement としか表示できない。

例えば、
<NAME><AAA>hoge</AAA>Widget Reporting</NAME>
のように書いてやれば
Array ( [0] => SimpleXMLElement Object ( [hoge] => fuga )
のようになります。


2 ● rouge_2008
●200ポイント ベストアンサー

ありがとうございます。
コメントをまとめただけの回答で失礼します。

PHPのバージョン5.6.11、および5.5.27で修正されたようです。
最新版の5.6.14では正常に取得できる事を確認済みです。(※5.6.11および5.5系最新の5.5.30でも確認済みですが、5.5.27は未確認)

・PHP 5 ChangeLog
http://php.net/ChangeLog-5.php#5.6.11

Version 5.6.11
10 Jul 2015


・Bug #66084 simplexml_load_string() mangles empty node name
https://bugs.php.net/bug.php?id=66084

・Fix #66084: whitespace depending iteration over SimpleXMLElements (php-src/1306)
https://github.com/php/php-src/pull/1306

英語が苦手なので全部は読んでいませんが、「var_dump」や「print_r」だけでなく「json_encode」にも影響があるという事です。


※libxmlの問題ではありませんでした。修正前の5.6.10でもバージョン2.9.2です。


kohhiさんのコメント
ありがとうございました。お手数おかけしました。また、よろしくお願いします。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ