PHPのSimpleXMLオブジェクトで子要素を取り出すためのいろいろな方法のメモ。
元のXMLがこんな感じの場合、
$str = <<< XML_END
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<parent>
<child>aaa</child>
<child>bbb</child>
<child>ccc</child>
<count>3</count>
</parent>
<hy-phen>hyphen</hy-phen>
</root>
XML_END;
$xml = simplexml_load_string($str);
普通に子要素を取り出す場合
var_dump($xml->parent->count);
↓
object(SimpleXMLElement)[5] string '3' (length=1)
繰り返しの子要素を同じように取り出そうとすると、1つ目だけ取り出してしまう
var_dump($xml->parent->child);
↓
object(SimpleXMLElement)[4] string 'aaa' (length=3)
1つ目以外が欲しい場合はインデックスで指定できる
var_dump($xml->parent->child[2]);
↓
object(SimpleXMLElement)[5] string 'ccc' (length=3)
繰り返しの子要素の全てを取り出す場合、foreachが使える
foreach ($xml->parent->child as $c) {
var_dump($c);
}
↓
object(SimpleXMLElement)[3] string 'aaa' (length=3)
object(SimpleXMLElement)[6] string 'bbb' (length=3)
object(SimpleXMLElement)[3] string 'ccc' (length=3)
さらに、繰り返しの子要素だけでなく、子要素全てを取り出す場合はchildren()を使う
foreach ($xml->parent->children() as $c) {
var_dump($c);
}
↓
object(SimpleXMLElement)[4] string 'aaa' (length=3)
object(SimpleXMLElement)[3] string 'bbb' (length=3)
object(SimpleXMLElement)[4] string 'ccc' (length=3)
object(SimpleXMLElement)[3] string '3' (length=1) ← childだけでなく、countも取れている
children()を使うと、繰り返しの子要素は配列にまとめられるようだ(foreachを使う分には意識することは無いけど)
var_dump($xml->parent->children());
↓
object(SimpleXMLElement)[4]
public 'child' => array
0 => string 'aaa' (length=3)
1 => string 'bbb' (length=3)
2 => string 'ccc' (length=3)
public 'count' => string '3' (length=1)
XML要素(タグ)の名前がPHPの変数名として使えない文字列の場合、{' '}で囲えばOK
var_dump($xml->{'hy-phen'});
↓
object(SimpleXMLElement)[5] string 'hyphen' (length=6)
NameSpaceを使っている要素の場合、children()のパラメータとしてNameSpaceを指定しないとうまく子要素が取得できない
$children = $xml->children('http://...');このとき、$childrenのさらに子要素を取得するためには$children->children()しないとなぜかうまく取得できない。
NameSpaceの指定がその子要素に引き継がれて、そのNameSpaceに該当する子要素のみ取得するようにフィルターがかかっている?
それがchidren()をパラメータ無しで呼ぶことによってフィルターが解除されるから?
参考:PHP: SimpleXML - Manual
0 件のコメント:
コメントを投稿