【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集

条件付きで要素を取得したい

次のようなHTMLで、divのclassが「b」内のh2の要素が「ccc」の場合のdivのクラスが「d」の要素を取得したいのです。
つまり下の例では、「111」と「333」を取得したいです。
queryにどのように記述すれば良いのでしょうか?

$document =<<<EOF
<div class=a>
 <div class=b>
  <h2 class=c>ccc</h2>
  <div class=d>111</div>
 </div>
 <div class=b>
  <h2 class=c>ccc[a]</h2>
  <div class=d>222</div>
 </div>
 <div class=b>
  <h2 class=c>ccc</h2>
  <div class=d>333</div>
 </div>
</div>
EOF;

$xpath = new DOMXPath($document);
$xpath->query('ここの記述が知りたい');

A 回答 (3件)

//div[@class='a']/div[@class!='b']



だと、「<div class='a'> の子要素の <div> で、classが'b'でないもの」 ですね。

「<div class='a'> の直下のテキスト」だと、
//div[@class='a']/text()
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/10/03 11:41

>それとこのようなquery内の記述方法が乗っているお薦めのサイトなどはありますでしょうか?



私は、下記を見ています。
http://www.doraneko.org/xml/xpath10/19991116/Ove …
ちょっと情報多すぎるなら、
http://ja.wikipedia.org/wiki/XML_Path_Language
とか。

初心者向けには「逆引きXPATH」とかあると良いのかな。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
紹介して頂きありがとうございます。見てみたのですが、
もう一つだけ疑問が湧きまして、申し訳ないのですが教えていただきたいのですが、

$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」のみ取得したい)
のですが、一応上のように記述しましたが、もちろんできなかったのですが、
この場合はどのように記述すれば良いのでしょうか?

お礼日時:2011/10/03 00:59

質問が曖昧ですが、「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']");

では?

この回答への補足

すいません、あれからもしやと思い

print_r($items);


ではなくて


foreach ($items as $item) {
$arr[] = $item->nodeValue;
}
print_r($arr);

で試してみたらできました。
勘違いしてまた、すいません。

補足日時:2011/10/02 23:14
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
早速それを試して見たのですが、

DOMNodeList Object ( )

とマッチしてないようなのです・・・
何か記述間違いということはないでしょうか?

それとこのようなquery内の記述方法が乗っているお薦めのサイトなどはありますでしょうか?
一応自分でも探してみたのですが、そもそもそのようなことを扱っているサイトが少ないというのもあるのでしょうが、
いまいちよく理解し難いというのがありまして・・・

お礼日時:2011/10/02 23:07

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