要素オブジェクトの取得[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)
}
}