(個人的には好きではないですが) XML ファイルには、ネームスーペースを設定することができます。ここでは、ネームスペースの設定されている XML ファイルの要素を取得するサンプルを掲載しています。
スポンサーリンク
XML ネームスペースの設定なし
まずはネームスペースの設定のない XML の要素を取得するサンプルです。
$xml = <<< EOS <?xml version='1.0' encoding='UTF-8' ?> <PEOPLE> <PERSON> <NAME>鈴木一郎</NAME> <AGE>37</AGE> </PERSON> <PERSON> <NAME>佐藤太郎</NAME> <AGE>40</AGE> </PERSON> </PEOPLE> EOS; $dom = new DomDocument(); $dom->loadXML($xml); $xpath = new DOMXPath($dom); $xquery = '//PEOPLE/PERSON/NAME/text()'; $names = $xpath->query($xquery); for($i=0; $i<$names->length; $i++) { echo $names->item($i)->nodeValue; } /* * 出力結果 *--------------------------------------------------- * 鈴木一郎 * 佐藤太郎 */
ネームスペース設定ありの XML の要素を取得する
ネームスペースが設定されている場合には、DOMXPath::registerNamespace メソッドを使用してネームスペースを登録する必要があります。ネームスペースを登録しないと期待する結果は取得できません。
$xml = <<< EOS <?xml version='1.0' encoding='UTF-8' ?> <PEOPLE xmlns='http://www.w3.org/2011/XMLSchema-instance'> <PERSON> <NAME>鈴木一郎</NAME> <AGE>37</AGE> </PERSON> <PERSON> <NAME>佐藤太郎</NAME> <AGE>40</AGE> </PERSON> </PEOPLE> EOS; $dom = new DomDocument(); $dom->loadXML($xml); $xpath = new DOMXPath($dom); /* * ネームスペース、プレフィックスを登録する */ $xpath->registerNamespace('ns', "http://www.w3.org/2011/XMLSchema-instance"); /* * 登録したプレフィックスを使用して、クエリを行う */ $xquery = '//ns:PEOPLE/ns:PERSON/ns:NAME/text()'; $names = $xpath->query($xquery); for($i=0; $i<$names->length; $i++) { echo $names->item($i)->nodeValue; } /* * 出力結果 *--------------------------------------------------- * 鈴木一郎 * 佐藤太郎 */