PHPでXMLを読み込んで処理するとき、xpath()を使おうとして失敗しました。

同じスクリプトで、xpath()で処理できるXMLと処理できない(何も出力されない)XMLがあった。

 

原因は、XML内に記述してある xmlns だった。

xmlnsがあると、xpath()がうまく動かないようだ。

参考 http://php.net/manual/ja/simplexmlelement.registerxpathnamespace.php

registerXPathNamespace ( string $prefix , string $ns )

上記のコードが必要だ。

また、xpath にも

'//c:Body/c:Warning[4]/c:Item[1]/c:Area/c:Name'

のようにプレフィックスが、いちいち必須になる

 

気象庁の注意報警報のXMLデータを読み込んだ時の処理。

対処法(PHPコード)

//XML読み込み	
$doc    = simplexml_load_file($url);
//xmlnsを指定
$doc->registerXPathNamespace('c', 'http://xml.kishou.go.jp/jmaxml1/body/meteorology1/');
//xpathで複数Nameが配列で取得される
//Bodyの下、4番目のWarningの下Itemの1番目の下のArea全部のName全部を取得してます
$results = $doc->xpath('//c:Body/c:Warning[4]/c:Item[1]/c:Area/c:Name');

foreach ( $results as $value) {
	echo $value; 
}

 

気象庁のXMLファイルをブラウザで見た感じの画像、registerXPathNamespaceにセットしたxlmnsの位置は緑のマーカーのところだ。