My Photo

« 2014秋アニメは大豊作かも | Main | ワールド・ウォーZ »

September 17, 2014

PHPメモ047:XML処理 その3 XPath

関連記事:
PHPメモ045:XML処理 その1 XMLをパースする
PHPメモ046:XML処理 その2 エラー処理

XPathでノードを参照する

名前空間がないXMLのノードをXPathで参照するコードを以下に示す。

$string = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<a>
 <b>
  <c>xxx</c>
  <c>yyy</c>
 </b>
 <d>
  <c>zzz</c>
 </d>
</a>
XML;

$xml = simplexml_load_string($string);

$result = $xml->xpath('/a/b');
echo "/a/b\n";
print_r($result);

$result = $xml->xpath('/a/b/c');
$i = 0;
while(list( , $node) = each($result)) {
    echo "/a/b/c [{$i}]\n";
    print_r($node);
    $i++;
}

出力は以下のようになる。

/a/b
Array
(
    [0] => SimpleXMLElement Object
        (
            [c] => Array
                (
                    [0] => xxx
                    [1] => yyy
                )

        )

)
/a/b/c [0]
SimpleXMLElement Object
(
    [0] => xxx
)
/a/b/c [1]
SimpleXMLElement Object
(
    [0] => yyy
)

XMLにデフォルトの名前空間がある場合

XMLにデフォルトの名前空間がある場合、上記と同様のコード

$string = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<a xmlns="http://into.cocolog-nifty.com/">
 <b>
  <c>xxx</c>
  <c>yyy</c>
 </b>
 <d>
  <c>zzz</c>
 </d>
</a>
XML;

// 以下略

を実行すると、出力は下記のようになりノードを参照することが出来ない。

/a/b
Array
(
)

名前空間がある場合は xpath() メソッドの前に registerXPathNamespace() メソッドで名前空間とプレフィックスを指定し、XPathにプレフィックスを付けると参照できるようになる。
コードを以下に示す。

// XMLは上のコードと同じ。

$xml = simplexml_load_string($string);

// プレフィックス、名前空間を指定
$xml->registerXPathNamespace('into', 'http://into.cocolog-nifty.com/');

$result = $xml->xpath('/into:a/into:b');
echo "/into:a/into:b\n";
print_r($result);

$result = $xml->xpath('/into:a/into:b/into:c');
$i = 0;
while(list( , $node) = each($result)) {
    echo "/into:a/into:b/into:c [{$i}]\n";
    print_r($node);
    $i++;
}

出力は以下。今度はノードを参照できている。

/into:a/into:b
Array
(
    [0] => SimpleXMLElement Object
        (
            [c] => Array
                (
                    [0] => xxx
                    [1] => yyy
                )

        )

)
/into:a/into:b/into:c [0]
SimpleXMLElement Object
(
    [0] => xxx
)
/into:a/into:b/into:c [1]
SimpleXMLElement Object
(
    [0] => yyy
)

registerXPathNamespace() メソッドはXMLに元々指定されていた名前空間のプレフィックスを変えたいときにも使用できる。

$string = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<hoge:a xmlns:hoge="http://into.cocolog-nifty.com/">
 <hoge:b>
  <hoge:c>xxx</hoge:c>
  <hoge:c>yyy</hoge:c>
 </hoge:b>
 <hoge:d>
  <hoge:c>zzz</hoge:c>
 </hoge:d>
</hoge:a>
XML;

$xml = simplexml_load_string($string);

// プレフィックスをhogeからintoに変更
$xml->registerXPathNamespace('into', 'http://into.cocolog-nifty.com/');

// 以下略

参考ページ:
PHP: SimpleXMLElement::registerXPathNamespace - Manual
PHP: SimpleXMLElement::xpath - Manual
SimpleXMLで名前空間付きタグの一覧を取得する - 肉とビールとパンケーキ by @sotarok

XMLの名前空間について参考ページ:
XML名前空間の簡単な説明

« 2014秋アニメは大豊作かも | Main | ワールド・ウォーZ »

PHP」カテゴリの記事

プログラミング、技術情報」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/60332437

Listed below are links to weblogs that reference PHPメモ047:XML処理 その3 XPath:

« 2014秋アニメは大豊作かも | Main | ワールド・ウォーZ »

March 2017
Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof