XML 네임 스페이스는 XML의 요소와 속성 사이의 명명 충돌을 해결하는 데 사용됩니다. 일반적으로 네임 스페이스는 URI로 식별되며 접두사는 네임 스페이스에 대한 참조를 단순화합니다. 예를 들어 다음 XML 문서에는 두 개의 네임 스페이스가 있습니다.
<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는 각각 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";
}
이 예에서는 모든 네임 스페이스를 동적으로 가져 와서 각 네임 스페이스의 접두사를 eresgionnamespace 를 사용하여 URI를 사용하여 URI를 사용하여 XPath 쿼리에 매핑합니다. 이를 통해 네임 스페이스의 특정 컨텐츠를 미리 알지 못하고 다른 네임 스페이스에서 XPath 쿼리를 수행 할 수 있습니다.
경우에 따라 XML 파일의 URL에는 일부 도메인 이름 정보가 직접 포함될 수 있습니다. 이러한 URL을 XPath 쿼리로 처리하려면 도메인 이름을 균일 한 값으로 바꿀 수 있습니다. 예를 들어, 모든 외부 URL의 도메인 이름을 m66.net 으로 바꾸어 XPath 쿼리의 안정성을 보장 할 수 있습니다.
예를 들어, XML 파일을로드 할 때 URL의 도메인 이름을 다음 코드로 바꿀 수 있습니다.