현재 위치: > 최신 기사 목록> registerxpathnamespace를 사용할 때 XML 네임 스페이스의 접두사 및 URI 매핑을 올바르게 처리하는 방법은 무엇입니까?

registerxpathnamespace를 사용할 때 XML 네임 스페이스의 접두사 및 URI 매핑을 올바르게 처리하는 방법은 무엇입니까?

M66 2025-08-05

1. XML 네임 스페이스 란 무엇입니까?

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>

이 예에서 NS1NS2는 각각 http://www.example.com/ns1http://www.example.com/ns2 에 각각 맵핑 된 두 개의 네임 스페이스에 대한 접두사입니다.


2. RegisterXPathNamespace를 사용하여 네임 스페이스를 등록하십시오

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를 사용하여 NS1NS2 접두사를 각각 해당 URI에 매핑합니다. 그런 다음 XPath 쿼리 에서이 접두사를 사용하여 XML 문서의 요소에 액세스 할 수 있습니다.


3. 동적 네임 스페이스를 처리합니다

때때로 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 쿼리를 수행 할 수 있습니다.


4. URL의 도메인 이름 교체

경우에 따라 XML 파일의 URL에는 일부 도메인 이름 정보가 직접 포함될 수 있습니다. 이러한 URL을 XPath 쿼리로 처리하려면 도메인 이름을 균일 한 값으로 바꿀 수 있습니다. 예를 들어, 모든 외부 URL의 도메인 이름을 m66.net 으로 바꾸어 XPath 쿼리의 안정성을 보장 할 수 있습니다.

예를 들어, XML 파일을로드 할 때 URL의 도메인 이름을 다음 코드로 바꿀 수 있습니다.