SimpleXMLで名前空間付きの属性を取得する




1年以上前に更新された記事です。
情報が古い可能性がありますので、注意してください。

名前空間付きのXML読むことがあったのでメモ。

<?xml version="1.0" encoding="UTF-8"?>
<xml xmlns:ns="http://example.com/ns/" xmlns:ans="http://example.com/ans/">
	<item>至って普通の要素</item>
	<item attr1="普通の属性1" attr2="普通の属性2">属性を持ってる要素</item>
	<ns:item>名前空間が付いている要素</ns:item>
	<ns:item attr1="普通の属性1" attr2="普通の属性2">
		名前空間が付いていて、属性を持ってる要素
	</ns:item>
	<ns:item ans:attr1="名前空間付きの属性1" ans:attr2="名前空間付きの属性2">
		名前空間が付いていて、名前空間付きの属性を持ってる要素
	</ns:item>
</xml>

名前空間付き要素はchildrenの引数に
名前空間付き属性はattributesの引数に
名前空間を指定すれば取得できるようです。

<?php
$xml = simplexml_load_file('test.xml') or die('XMLパースエラー');

// 至って普通の要素
echo $xml->item[0]."n";
echo "n";

// 属性を持ってる要素
echo $xml->item[1]."n";															// 要素
echo $xml->item[1]['attr1']."n";												// 属性
echo $xml->item[1]['attr2']."n";												// 属性
echo "n";

// 名前空間付き要素
echo $xml->children('ns', true)->item[0]."n";
echo "n";

// 名前空間が付いていて、属性を持ってる要素
echo $xml->children('ns', true)->item[1]."n";									// 要素
echo $xml->children('ns', true)->item[1]->attributes()->attr1."n";				// 属性
echo $xml->children('ns', true)->item[1]->attributes()->attr2."n";				// 属性
echo "n";

// 名前空間が付いていて、名前空間付きの属性を持ってる要素
echo $xml->children('ns', true)->item[2]."n";									// 要素
echo $xml->children('ns', true)->item[2]->attributes('ans', true)->attr1."n";	// 属性
echo $xml->children('ns', true)->item[2]->attributes('ans', true)->attr2."n";	// 属性
echo "n";

?>

実行結果

>php simpleXML.php
至って普通の要素

属性を持ってる要素
普通の属性1
普通の属性2

名前空間が付いている要素

名前空間が付いていて、属性を持ってる要素
普通の属性1
普通の属性2

名前空間が付いていて、名前空間付きの属性を持ってる要素
名前空間付きの属性1
名前空間付きの属性2

横に長くなるので、適宜変数に入れたほうがスッキリするかも。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です