(個人的には好きではないですが) 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;
}
/*
* 出力結果
*---------------------------------------------------
* 鈴木一郎
* 佐藤太郎
*/