dポイントプレゼントキャンペーン実施中!

example1.xml
-----------------------
<item>
 <color>red</color>
 <omake>candy</omake>
</item>
-----------------------

example2.xml
-----------------------
<item>
 <color>black</color>
</item>
-----------------------

上記はXMLファイルの2パターンを示したものです。

商品(item)によって、オマケ(omake)があったりなかったりします。
オマケがない時には、タグ自体存在しません。

なので、タグがない時に、そのデータをDOMで取得しようとすると、
エラーが吐かれます。
Notice: Trying to get property of non-object in~~~

私がしたいことは、
タグがない場合には、値を取得しない。
という分岐をさせることです。

例えば、

$items = $doc->getElementsByTagName('color');
if(isset($items)){echo $items->item(0)->nodeValue;}

こんな感じで考えたのですが、ダメでした。
タグが無くても、$itemsはNULLではないため、
if文の中に入ってしまい、
結局、$items->item(0)->nodeValue; を通過しようとして、
Notice: Trying to get property of non-object in~~~
が吐かれます。
($itemsは、object(DOMNodeList)#3 (0) { }といった内容で、NULLではない。)

また、

if(isset($items->item(0)->nodeValue)){
 echo $items->item(0)->nodeValue;
}

のようにすると、
isset()のところで、やはり、
$items->item(0)->nodeValue
を通過しようとして、
Notice: Trying to get property of non-object in~~~
が吐かれます。

こういった場合、どうしたら良いのでしょうか。
宜しくお願いします。
(PHP5の環境です。)

A 回答 (3件)

getElementsByTagNameはNULLを返しません。

必ず、DOMNodeListを返します。
そしてDOMNodeListは、lengthというプロパティを持ちます。
ので、

<?php

$omake = $doc->getElementsByTagName('omake');

echo $omake->length; //存在しないなら『0』を返します。


?>

といった感じです。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。

なるほど、そうやって判定をするんですね。
解説、とてもよく分かりました。
ありがとうございます。
問題解決です!

ちなみに、以下のような判定方法では、
ダメでしょうか?
何か、抜け はありますか?

$items = $doc->getElementsByTagName('omake');
if($items->item(0) !== NULL){
 echo 'omakeタグはあります!';
}

お礼日時:2010/12/18 00:56

その方法でも出来るのであれば問題ないのでしょうけど、メソッドを叩くだけ、オーバーヘッドになるので、


プロパティで値が引けるのであれば、プロパティで値を確認したほうが良いと思います。
そして、正しく引く方法が提供されているのに使わない、というのは筋が悪い、と私は思います。

ちなみに、限定してXMLを操作するなら、
http://jp2.php.net/manual/ja/book.simplexml.php
こちらもありますので、何か使い勝手の面で思うところがあったら、試してみても良いかもしれません。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。

とても勉強になりました。
教えて頂いた方法で判定するように致します。
私が書いたもう1つの方法は、
今回教えて頂くまでの間にvar_dump()を使って試行錯誤した結果、
偶然、見つけた方法だったので、
良いか悪いかよく分からずに使っておりました。
ちゃんとした方法があるのであれば、
そちらを使えるようになりたいので、
教えて頂き、とても助かりました。

お礼日時:2010/12/18 04:40

XPath を使って要素の有無を確認してはいかがでしょうか。



参考URL:http://jp.php.net/manual/ja/class.domxpath.php
    • good
    • 0
この回答へのお礼

どうもありがとうございます。

結論から先に言うと、解決しましたが、
できなかった原因は、XPathでやらなかったことにあるのではなく、
isset()で判定したことにありました。

if($hoge !== NULL){~~~;} として判定すると上手くいきました。

if(isset($hoge)){~~~;} ではダメなのです。

$hoge が NULLかどうかの判定には、どちらで判定しても、
結果は同じだと思っていたのですが、実際には、ハッキリと違いました。

なぜ違うのかについて、もしご存知の方は、是非教えて下さい。

お礼日時:2010/12/17 10:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!