作成日:2021-05-07, 更新日:2021-05-10
基本
XMLの解析にはいくつか方法がある
・simplexml_load_string
・DOMDocument
※他にもあるっぽい。
▼namespace(名前空間)があるときはちょっと面倒。
・simplexml_load_string - 名前空間を指定してあげる必要あり
・DOMDocument - 名前空間を使わずとも取得可能
名前空間がないとき
▼こんなヤツ
~ 略 ~ <foo 〇〇〇〇>丸ごとシマウマ</foo> ~ 略 ~
XMLの文字列を「simplexml_load_string()」に放り込むだけでOK
$xml_str = 〇〇〇; $xml_obj = simplexml_load_string($xml_str); var_dump($xml_obj);
パースしたいXML
▼こんなヤツ
~ 略 ~ <hoge:foo 〇〇〇〇>丸ごとシマウマ</hoge:foo> ~ 略 ~
※上記の場合「hogeが名前空間」で「fooがlocalName」になる
simplexml_load_string - 名前空間を指定する
ひと手間加える必要がある
$xml_str = 〇〇〇;
$xml_obj = simplexml_load_string($xml_str);
// children()に名前空間である「hoge」をつっこんで、localNameである「foo」で取得
echo $xml_obj->children('hoge', true)->foo; // 「丸ごとシマウマ」が出力される
DOMDocument - 名前空間を指定したくない
名前空間を使わずにlocalNameだけでどうにかする
$xml_str = 〇〇〇;
$xml_obj = new DOMDocument;
$xml_obj->loadXML($xml_str);
foreach( $xml_obj->getElementsByTagName('foo') as $foo ){
// localNameである「foo」で取得
echo $foo->localName . ' - ' . $foo->nodeValue; // 「foo - 丸ごとシマウマ」みたいな感じで出力される
}
子要素
▼こんな感じのXML
~ 略 ~ <hoge:foo 〇〇〇〇> <bar:abc 〇〇〇〇>もちベーコン</bar:abc> </hoge:foo> ~ 略 ~
▼良い方法があると思うけど・・・スケジュールの都合で未調査
$xml_str = 〇〇〇;
$xml_obj = new DOMDocument;
$xml_obj->loadXML($xml_str);
foreach( $xml_obj->getElementsByTagName('foo') as $foo ){
foreach( $foo->getElementsByTagName('abc') as $abc ){
echo $abc->localName . ' - ' . $abc->nodeValue; // 「abc - もちベーコン」みたいな感じで出力される
}
}
XMLの解析失敗対応 - libxml_get_errors()
変なXMLを解析しようとしたときのエラー対応
▼DOMDocument、simplexml_load_stringのどちらもlibxml_get_errors()でエラーを取得可能
libxml_use_internal_errors(true); // ユーザーによるエラー処理の有効化
$xml_str = 〇〇〇;
// ▼simplexml_load_stringのとき
// $xml_obj = simplexml_load_string($xml_str);
// if ($xml_obj === false) {
// foreach(libxml_get_errors() as $error) {
// // var_dump($error);
// echo $error->message;
// }
// libxml_clear_errors();
// exit;
// }
// ▼DOMDocumentのとき
$xml_obj = new DOMDocument;
if ( !$xml_obj->loadXML($xml_str) ) {
foreach (libxml_get_errors() as $error) {
// var_dump($error);
echo $error->message;
}
libxml_clear_errors();
exit;
}