[ PHP ] ネームスペース付 XML の要素を取得する( registerNamespace )

Pocket

(個人的には好きではないですが) 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;
}

/*
 * 出力結果
 *---------------------------------------------------
 * 鈴木一郎
 * 佐藤太郎
 */

参考
スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>