重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

PHP5でXMLのテストをしているのですが、わからないことがあります。

--- test.xml

<A>
<B>
<C>TEST</C>
<D>
<E>1</E>
<F>2</F>
<G>3</G>
</D>
</B>
</A>

<?php
$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
$doc->Load('test.xml');
$xpath = new DOMXPath($doc);
$query = '//A/B/D/E';
$entries = $xpath->query($query);
foreach ($entries as $entry) {
echo "$entry->nodeValue\n";
}

で1が返されますが、
$query = '//A/B/D/E';
で、Eのノードを決め打ちしているので、foreachで回すのが気に入らないのですが
この方法が一般的でしょうか?

$e = なんとか??;
で$entries = $xpath->query($query);
のあと、取得できないでしょうか?

あと、クエリという使い方で例えば2以上データを取得する
この場合はF,Gの要素を取得するクエリの記述方法が知りたいです。

A 回答 (1件)

>$e = なんとか??;



http://www.php.net/manual/en/domxpath.query.php
DOMXPath::query()の戻り値はDOMNodeListであり、
http://www.php.net/manual/en/class.domnodelist.php
DOMNodeListはitemメソッドを持つので
$e = $xpath->query($query)->item(0);
print($xpath->query($query)->item(0)->nodeValue);
のような記述は可能でしょう、という返答でいいのかな?

>例えば2以上データを取得する
それはつまり,
<A>
<B>
<C>TEST</C>
<D>
<E>3</E>
<F>4</F>
<G>3</G>
<H>5</H>
</D>
</B>
</A>

$query = '//A/B/D/*[number(text()) < 4]';
とかやったときに4未満の要素である
E,Gが含まれるDOMNodeListが返ってくるという話だよね?
'//A/B/D/*[position() > 2]';
で2番目以降のG,Hが含まれる要素、ってんじゃないよね?

#詳しい話は
XPath 1.0
http://www.w3.org/TR/xpath
でも読んでね。
    • good
    • 0

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