• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:条件付きで要素を取得したい)

条件付きで要素を取得する方法

このQ&Aのポイント
  • 次のようなHTMLで、divのclassが「b」内のh2の要素が「ccc」の場合のdivのクラスが「d」の要素を取得する方法を教えてください。
  • 要素を取得する方法について質問させてください。
  • 具体的な例として、classが「b」のdiv要素の中で、classが「c」のh2要素が「ccc」となっている場合のdiv要素のクラスを取得する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.1

質問が曖昧ですが、「divのclassが「b」内のh2の要素が「ccc」の場合、そのh2と同じ階層のdivのクラスが「d」の要素」ということなら、xpathは、 //div[@class='b']/h2[.='ccc']/../div[@class='d'] 「divのclassが「b」内のh2の要素が「ccc」の場合、そのh2の直後のdivのクラスが「d」の要素」 だと面倒な気がする。 ただ、プログラム違いませんか? $doc = DOMDocument::loadHTML($document); $xpath = new DOMXPath($doc); $items = $xpath->query("//div[@class='b']/h2[.='ccc']/../div[@class='d']"); では?

takagoo100
質問者

お礼

ご回答ありがとうございます。 早速それを試して見たのですが、 DOMNodeList Object ( ) とマッチしてないようなのです・・・ 何か記述間違いということはないでしょうか? それとこのようなquery内の記述方法が乗っているお薦めのサイトなどはありますでしょうか? 一応自分でも探してみたのですが、そもそもそのようなことを扱っているサイトが少ないというのもあるのでしょうが、 いまいちよく理解し難いというのがありまして・・・

takagoo100
質問者

補足

すいません、あれからもしやと思い print_r($items); ではなくて foreach ($items as $item) { $arr[] = $item->nodeValue; } print_r($arr); で試してみたらできました。 勘違いしてまた、すいません。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.3

//div[@class='a']/div[@class!='b'] だと、「<div class='a'> の子要素の <div> で、classが'b'でないもの」 ですね。 「<div class='a'> の直下のテキスト」だと、 //div[@class='a']/text()

takagoo100
質問者

お礼

ご回答ありがとうございます。 なるほど、そのやり方でできました。 ありがとうございます。 そこでそれに関連してですが、もう一つ疑問ができまして、、 ただこの質問スレッドでこれ以上引っぱるのもあれなので、 再度新たに質問を立てさせて頂きたいのですが、その場合もアドバイス頂けたらうれしいです。

  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.2

>それとこのようなquery内の記述方法が乗っているお薦めのサイトなどはありますでしょうか? 私は、下記を見ています。 http://www.doraneko.org/xml/xpath10/19991116/Overview.html ちょっと情報多すぎるなら、 http://ja.wikipedia.org/wiki/XML_Path_Language とか。 初心者向けには「逆引きXPATH」とかあると良いのかな。

takagoo100
質問者

お礼

ご回答ありがとうございます。 紹介して頂きありがとうございます。見てみたのですが、 もう一つだけ疑問が湧きまして、申し訳ないのですが教えていただきたいのですが、 $document =<<<EOF <div class=a><div class=b>bbb</div>aaa<div class=b>bbb</div></div> EOF; $doc = DOMDocument::loadHTML($document); $xpath = new DOMXPath($doc); $items = $xpath->query("//div[@class='a']/div[@class!='b']"); foreach ($items as $item) { $arr[] = $item->nodeValue; } print_r($arr); 上の例で、 クラスが「a」の要素で、かつ、クラスが「b」の要素は取得したくない(つまり「aaa」のみ取得したい) のですが、一応上のように記述しましたが、もちろんできなかったのですが、 この場合はどのように記述すれば良いのでしょうか?

関連するQ&A