PHPでnamespaceがあるXMLを処理する方法
苦労したのでメモしておく。
単純にsimplexml_load_string()でXMLを読み込むだけでは、namespaceの要素は取り出せない。取り出す方法はいくつかあるが、一番シンプルな方法だと以下のようになった。
<?php
//XMLファイルをObjectとして読み込み
$url = "URL名";
$xmlstring = file_get_contents($url);
$xmlObject = simplexml_load_string( $xmlstring );
//XMLに含まれるnamespace一覧を取得
$ns = $xmlObject->getDocNamespaces(true);
//取得したい要素が1つに限定できる場合
$a = $xmlObject->"前に子要素がある場合は要素名"->children($ns['namespace名'])->"取得したい要素名";
//複数の要素が存在する場合
foreach($xmlObject->"前に子要素がある場合は要素名" as $item){
$b = $item->children($ns['namespace名'])->"取得したい要素名";
?>
<問題点>
foreach文の繰り返し回数を表示する処理を加えたい場合うまく動かない。おそらく何か間違えているとは思うのだが、よくわからなかった。
foreach($xmlObject->youso as $index => $item){
echo "index:" . $index;
}
/*
~ % index:youso
~ % index:youso
~ % index:youso
(繰り返し回数ではなく、要素名が表示される)
*/
<参考HP>
XML名前空間の簡単な説明 - The Web KANZAKI
https://www.kanzaki.com/docs/sw/names.html
関連記事