August 04, 2008
XML Xpath
クエリの頭が"//"の場合は絶対パス、無い場合は相対パスとなる。相対パスを使用する時はevaluate()メソッドの第2引数に基点となるノードを渡す。
全てのfoo要素
属性は"@属性名"で指定する。
attr属性を持つfoo要素
テキストノード(の内容)はtext()で指定する。
テキストが'test'のfoo要素。
users.xml
全てのfoo要素
$items = $xpath->evaluate("//foo");
$nodeの子要素のfoo要素(孫以下は含まれない)
$items = $xpath->evaluate("foo", $node);
属性は"@属性名"で指定する。
attr属性を持つfoo要素
$items = $xpath->evaluate("//foo[@attr]");
attr属性の値が'test'のfoo要素
$items = $xpath->evaluate("//foo[@attr = 'test']");
attr属性の値が'http://'で始まるfoo要素
$items = $xpath->evaluate("//foo[starts-with(@attr, 'http://')]");
attr属性の値が'http://'で始まらないfoo要素
$items = $xpath->evaluate("//foo[not(starts-with(@attr, 'http://'))]");
attr属性の値が'http://'で始り、attr2属性の値が'hoge'のfoo要素
$items = $xpath->evaluate("//foo[starts-with(@attr, 'http://') and attr2 = 'hoge']");
attr属性の値に'://'を含むfoo要素
$items = $xpath->evaluate("//foo[contains(@attr, '://')");
テキストノード(の内容)はtext()で指定する。
テキストが'test'のfoo要素。
$items = $xpath->evaluate("//foo[text() = 'test']");
テキストが'test'でないfoo要素。
$items = $xpath->evaluate("//foo[text() != 'test']");
users.xml
<?xml version="1.0" encoding="utf-8"?>
<users>
<user id="1">
<name>satou</name>
<age>20</age>
</user>
<user id="2">
<name>tanaka</name>
<age>30</age>
</user>
<user id="3">
<name>suzuki</name>
<age>40</age>
</user>
</users>
ageの値(テキスト)が30以上のuser要素
$items = $xpath->evaluate("user[age/text() >= 30]", $users);
var_dump($item->length); // int(2)
ageが30以上、かつnameが'suzuki'のuser要素
$items = $xpath->evaluate("user[age/text() >= 30 and name/text() = 'suzuki']", $users);
var_dump($item->length); // int(1)