
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の環境です。)
No.2ベストアンサー
- 回答日時:
getElementsByTagNameはNULLを返しません。
必ず、DOMNodeListを返します。そしてDOMNodeListは、lengthというプロパティを持ちます。
ので、
<?php
$omake = $doc->getElementsByTagName('omake');
echo $omake->length; //存在しないなら『0』を返します。
?>
といった感じです。
どうもありがとうございます。
なるほど、そうやって判定をするんですね。
解説、とてもよく分かりました。
ありがとうございます。
問題解決です!
ちなみに、以下のような判定方法では、
ダメでしょうか?
何か、抜け はありますか?
$items = $doc->getElementsByTagName('omake');
if($items->item(0) !== NULL){
echo 'omakeタグはあります!';
}
No.3
- 回答日時:
その方法でも出来るのであれば問題ないのでしょうけど、メソッドを叩くだけ、オーバーヘッドになるので、
プロパティで値が引けるのであれば、プロパティで値を確認したほうが良いと思います。
そして、正しく引く方法が提供されているのに使わない、というのは筋が悪い、と私は思います。
ちなみに、限定してXMLを操作するなら、
http://jp2.php.net/manual/ja/book.simplexml.php
こちらもありますので、何か使い勝手の面で思うところがあったら、試してみても良いかもしれません。
どうもありがとうございます。
とても勉強になりました。
教えて頂いた方法で判定するように致します。
私が書いたもう1つの方法は、
今回教えて頂くまでの間にvar_dump()を使って試行錯誤した結果、
偶然、見つけた方法だったので、
良いか悪いかよく分からずに使っておりました。
ちゃんとした方法があるのであれば、
そちらを使えるようになりたいので、
教えて頂き、とても助かりました。
No.1
- 回答日時:
どうもありがとうございます。
結論から先に言うと、解決しましたが、
できなかった原因は、XPathでやらなかったことにあるのではなく、
isset()で判定したことにありました。
if($hoge !== NULL){~~~;} として判定すると上手くいきました。
if(isset($hoge)){~~~;} ではダメなのです。
$hoge が NULLかどうかの判定には、どちらで判定しても、
結果は同じだと思っていたのですが、実際には、ハッキリと違いました。
なぜ違うのかについて、もしご存知の方は、是非教えて下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
バッチファイルでpingの結果を...
-
shシェルスクリプト 空白行の...
-
小数点以下0の非表示
-
findstrのerrorlevel
-
ゼロとNULLを区別して number_f...
-
$_POST,$_GETの値が空...
-
環境変数「%USERPROFILE%」の内...
-
batファイルでPC名称の変更
-
PHPとCSSを使用して九九...
-
XMLのタグの有無をPHPで判定し...
-
switch文の中でforeach
-
eとは?
-
switch()文で値の大小比較
-
バッチファイルで、全てのウィ...
-
コマンドプロンプト フォルダ内...
-
[php] スクレイピングで外部サ...
-
hiddenを使っているのに、表が...
-
PHP form action 次のページ...
-
【初歩】 for構文内におけるロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
バッチファイルでpingの結果を...
-
shシェルスクリプト 空白行の...
-
switch()文で値の大小比較
-
findstrのerrorlevel
-
ゼロとNULLを区別して number_f...
-
小数点以下0の非表示
-
バッチファイルで、全てのウィ...
-
syntax error, unexpected 'ech...
-
PHPで画像を取得、保存する方法
-
【初歩】 for構文内におけるロ...
-
コマンドプロンプト echo onで...
-
画像の削除
-
ISSETで変数に値が入っていない...
-
phpでcookieがうまく保存されない
-
pdftkを使った処理をバッチファ...
-
phpで「+=」と「=+」の違いは?
-
Windowsのsetコマンドでの小数...
-
4桁の乱数の発生
-
オブジェクトの中身の判定(PHP)
おすすめ情報