August 04, 2008

XML Xpath

クエリの頭が"//"の場合は絶対パス、無い場合は相対パスとなる。相対パスを使用する時はevaluate()メソッドの第2引数に基点となるノードを渡す。

全ての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)


トラックバックURL

コメントする

名前:
URL:
  情報を記憶: 評価:  顔   星
 
 
 
Sabel

Sabel PHP Frameworkを開発しています。
http://www.sabel.jp/

Search
Categories
Tags
Recent Articles
Archives