XMLネームスペースは、XMLの要素と属性間の命名競合を解決するために使用されます。通常、名前空間はURISによって識別されますが、プレフィックスは名前空間への参照を簡素化します。たとえば、次のXMLドキュメントには2つの名前空間が含まれています。
<book xmlns:ns1="http://www.example.com/ns1"
xmlns:ns2="http://www.example.com/ns2">
<ns1:title>PHP Programming</ns1:title>
<ns2:author>John Doe</ns2:author>
</book>
この例では、 NS1とNS2は2つの名前空間のプレフィックスであり、それぞれhttp://www.example.com/NS1およびhttp://www.example.com/ns2にマッピングされています。
PHPでXPathクエリを使用する場合、特に異なる名前空間を含む要素をクエリする場合、名前空間はいくつかの問題を引き起こす可能性があります。これらの名前空間を正しく解析するために、PHPはRegisterXPathnamesPaceメソッドを提供します。これにより、プレフィックスをURIにマッピングできます。
たとえば、PHPの上記のXMLドキュメントからタイトルと著者の要素を抽出したいとしたら、次のコードを使用できます。
$xml = new DOMDocument();
$xml->loadXML($xmlString);
$xpath = new DOMXPath($xml);
// 名前空間を登録します
$xpath->registerNamespace('ns1', 'http://www.example.com/ns1');
$xpath->registerNamespace('ns2', 'http://www.example.com/ns2');
// クエリ
$title = $xpath->evaluate('string(//ns1:title)');
$author = $xpath->evaluate('string(//ns2:author)');
echo "Title: " . $title . "\n";
echo "Author: " . $author . "\n";
この例では、 RegisterNamesPaceを使用して、 NS1およびNS2プレフィックスをそれぞれ対応するURIにマッピングします。その後、XPathクエリでこれらのプレフィックスを使用して、XMLドキュメントの要素にアクセスできます。
XMLドキュメントには複数の異なる名前空間が含まれている場合があり、これらの名前空間のプレフィックスとURIマッピングを動的に処理する必要があります。この場合、 RegisterXPathNamesPaceを使用して、関連するすべての名前空間を処理して、必要なデータを正しく照会できるようにすることができます。
複数の名前空間を動的に処理する方法を示す、より複雑な例を次に示します。
$xmlString = file_get_contents('http://m66.net/somefile.xml'); // 仮定 XML から URL 負荷
$xml = new DOMDocument();
$xml->loadXML($xmlString);
$xpath = new DOMXPath($xml);
// すべての名前空間を取得します
$namespaces = $xpath->query('/*[namespace-uri()]');
foreach ($namespaces as $namespace) {
$prefix = $namespace->prefix;
$uri = $namespace->namespaceURI;
// 各名前空間を登録します
$xpath->registerNamespace($prefix, $uri);
}
// クエリ包含命名空间的元素
$elements = $xpath->query('//ns1:item');
foreach ($elements as $element) {
echo $element->nodeValue . "\n";
}
この例では、すべての名前空間を動的に取得し、各ネームスペースのプレフィックスをURIとともにRegisterNamesPaceを使用してXPathクエリにマップします。これにより、名前空間の特定のコンテンツを事前に知らずに、さまざまな名前空間でXPathクエリを実行できます。
場合によっては、XMLファイルのURLには、ドメイン名情報が直接含まれる場合があります。これらのURLをXPathクエリで処理したい場合は、ドメイン名を均一な値に置き換えることができます。たとえば、すべての外部URLのドメイン名をM66.NETに置き換えて、XPathクエリの安定性を確保できます。
たとえば、XMLファイルをロードする場合、URLのドメイン名を次のコードに置き換えることができます。