![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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で質問しましょう!
似たような質問が見つかりました
- オープンソース cssで中央寄せ 1 2023/05/19 06:25
- HTML・CSS cssが効かなくて困ってます 1 2023/01/01 23:57
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- その他(プログラミング・Web制作) python 2 2022/12/23 09:06
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- JavaScript vertical sliderをautoplayしたい 2 2022/08/25 14:47
- その他(Microsoft Office) VBA メール送信済で実行されるはずが、実行されない時があります。 2 2023/02/02 14:05
- 英語 下記の英語は正しいですか? 2 2022/07/04 16:38
- HTML・CSS FC2カートのテンプレートでの商品表示について 1 2023/03/02 18:05
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイルでpingの結果を...
-
Dosブロンプトでtabを出力したい
-
phpでcookieがうまく保存されない
-
ゼロとNULLを区別して number_f...
-
switch()文で値の大小比較
-
csvの特定のキーワードを指定し...
-
syntax error, unexpected 'ech...
-
vbsのif文で複数条件の判定
-
動的なPHPを静的なhtmlページに...
-
hiddenを使っているのに、表が...
-
DBのハッシュ化したパスワード...
-
WIN FIXER2005
-
連想配列からテーブルを作成す...
-
PHP 四則演算について
-
echoの直後に変数(文字列では...
-
Windowsのsetコマンドでの小数...
-
pear のAUTHでsetAuthDataで登...
-
PHPで3番目に大きい数を求める
-
PHPとCSSを使用して九九...
-
openssl関数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
switch()文で値の大小比較
-
バッチファイルでpingの結果を...
-
shシェルスクリプト 空白行の...
-
phpでcookieがうまく保存されない
-
findstrのerrorlevel
-
syntax error, unexpected 'ech...
-
小数点以下0の非表示
-
バッチファイルで、全てのウィ...
-
オブジェクトの中身の判定(PHP)
-
PHPで訪問回数を表示するカウン...
-
ゼロとNULLを区別して number_f...
-
bashの関数の引数にスペースが...
-
ナベアツプログラム(3の倍数...
-
変数の受け渡しによる画像の表示
-
PHP一覧表示した項目にリンクを...
-
Windowsのsetコマンドでの小数...
-
Parse error というエラーの対...
-
pdftkを使った処理をバッチファ...
-
DBのハッシュ化したパスワード...
おすすめ情報