要素オブジェクトの取得[XML DOM関数]

ここでは、XMLから要素オブジェクトを取得する方法を見てみます。

サンプルとしてlivedoorのお天気情報サービス(Livedoor Weather Web Service / LWWS)を
使用しています。

http://weather.livedoor.com/forecast/webservice/rest/v1?city=84&day=today

タグ名から要素オブジェクトを取得

XML DOM関数で、特定のタグ名から要素オブジェクトを取得するにはget_elements_by_tagname()
を使用します。

livedoorのお天気情報サービス(Livedoor Weather Web Service / LWWS)を例に取得して見ます。
get_elements_by_tagname()関数に'image'というタグ名を指定することで要素を取得します。

<?php

$request = "http://weather.livedoor.com/forecast/webservice/rest/v1?city=84&day=today";

$weatherxml = file_get_contents($request);

$dom = @domxml_open_mem($weatherxml,
        (DOMXML_LOAD_PARSING | 
        DOMXML_LOAD_COMPLETE_ATTRS | 
        DOMXML_LOAD_SUBSTITUTE_ENTITIES | 
        DOMXML_LOAD_DONT_KEEP_BLANKS ));

//imageタグの取得
$element = $dom->get_elements_by_tagname('image');

var_dump($element);

?>

取得結果は、次のようになります。

array(2) {
  [0]=>
  object(domelement)(4) {
    ["type"]=>int(1)
    ["tagname"]=>string(5) "image"
    [0]=>int(4)
    [1]=>int(160009608)
  }
  [1]=>object(domelement)(4) {
    ["type"]=>int(1)
    ["tagname"]=>string(5) "image"
    [0]=>int(5)
    [1]=>int(160028384)
  }
}

ここで得られた結果は、ノードは要素(Element)でxml文書中に2箇所タグが出現します。
取得できた要素がElementであるかどうかは、typeでわかります。typeが1の場合
(定数:XML_ELEMENT_NODE)となりElementであることがわかります。

子要素の取得(child_nodes)

要素オブジェクトを取得するもうひとつの方法は、child_nodes()を使用することです。
先ほどのimage要素から子要素を取得します。

<?php

$request = "http://weather.livedoor.com/forecast/webservice/rest/v1?city=84&day=today";

$weatherxml = file_get_contents($request);

$dom = @domxml_open_mem($weatherxml,
        (DOMXML_LOAD_PARSING | 
        DOMXML_LOAD_COMPLETE_ATTRS | 
        DOMXML_LOAD_SUBSTITUTE_ENTITIES | 
        DOMXML_LOAD_DONT_KEEP_BLANKS ));

//imageタグの取得
$element = $dom->get_elements_by_tagname('image');
$nodes = $element[0]->child_nodes();

var_dump($nodes);

?>

この例では、1つ目imageタグから子要素を取得しています。結果は、次のようになります。

array(5) {
  [0]=>
  object(domelement)(4) {
    ["type"]=>int(1)
    ["tagname"]=>string(5) "title"
    [0]=>int(6)
    [1]=>int(157581840)
  }
  [1]=>
  object(domelement)(4) {
    ["type"]=>int(1)
    ["tagname"]=>string(4) "link"
    [0]=>int(7)
    [1]=>int(157581520)
  }
  [2]=>
  object(domelement)(4) {
    ["type"]=>int(1)
    ["tagname"]=>string(3) "url"
    [0]=>int(8)
    [1]=>int(162447808)
  }
  [3]=>
  object(domelement)(4) {
    ["type"]=>int(1)
    ["tagname"]=>string(5) "width"
    [0]=>int(9)
    [1]=>int(160469272)
  }
  [4]=>
  object(domelement)(4) {
    ["type"]=>int(1)
    ["tagname"]=>string(6) "height"
    [0]=>int(10)
    [1]=>int(158364184)
  }
}