>Java >java지도 시간 >XPath를 사용하여 기본 네임스페이스가 있는 XML 문서를 처리하는 방법은 무엇입니까?

XPath를 사용하여 기본 네임스페이스가 있는 XML 문서를 처리하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-24 07:00:021078검색

How to Handle XML Documents with Default Namespace Using XPath?

기본 네임스페이스가 있는 XML 문서에 XPath 사용

기본 네임스페이스가 있는 XML 문서로 작업할 때 XPath 표현식을 활용하는 것이 어려워 보일 수 있습니다. 네임스페이스 URI를 명시적으로 선언하지 않고. 그러나 이 상황을 해결하는 접근 방식이 있습니다.

Namespace Awareness를 False로 설정

원래 질문에서 언급했듯이 초기 이해는 네임스페이스 Aware를 false로 설정하는 것이었습니다. DocumentBuilderFactory를 사용하면 네임스페이스 URI를 사용하여 작업할 필요가 없습니다. 그러나 이 접근 방식은 기본 네임스페이스가 있는 문서에는 적합하지 않습니다. 기본 네임스페이스에는 명시적인 처리가 필요합니다.

NamespaceContext 활용

대체 솔루션은 XPath 실행 중에 NamespaceContext를 사용하는 것입니다. 이를 통해 XPath 표현식 내의 네임스페이스와 접두사를 연결할 수 있습니다. 사용되는 접두사는 XML 문서에 정의된 접두사와 다를 수 있습니다.

다음은 이 접근 방식을 구현하는 예입니다.

<code class="java">import javax.xml.namespace.NamespaceContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class Demo {

    public static void main(String[] args) {
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true);
        try {
            DocumentBuilder builder = domFactory.newDocumentBuilder();
            Document dDoc = builder.parse("E:/test.xml");

            XPath xPath = XPathFactory.newInstance().newXPath();
            xPath.setNamespaceContext(new MyNamespaceContext());
            NodeList nl = (NodeList) xPath.evaluate("/ns:root/ns:author", dDoc, XPathConstants.NODESET);
            System.out.println(nl.getLength());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static class MyNamespaceContext implements NamespaceContext {

        public String getNamespaceURI(String prefix) {
            if("ns".equals(prefix)) {
                return "http://www.mydomain.com/schema";
            }
            return null;
        }

        public String getPrefix(String namespaceURI) {
            return null;
        }

        public Iterator getPrefixes(String namespaceURI) {
            return null;
        }

    }

}</code>

이 예에서 제공된 NamespaceContext는 'ns' 접두사를 다음에 매핑합니다. XML 문서에 사용된 네임스페이스 URI.

수정된 XPath 표현식

Dennis는 원래 XPath 표현식 "/root/author"가 잘못되었음을 올바르게 지적합니다. 기본 네임스페이스가 있는 문서의 경우 올바른 표현은 "/ns:root/ns:author"여야 합니다. 이는 코드에 새로 도입된 네임스페이스 접두사와 일치합니다.

네임스페이스 인식을 통한 단순화

흥미롭게도 네임스페이스Aware를 true로 설정하고 NamespaceContext를 생략하면 원하는 결과. 이는 다음 코드에서 설명됩니다.

<code class="java">import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class Demo {

    public static void main(String[] args) {
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true);
        try {
            DocumentBuilder builder = domFactory.newDocumentBuilder();
            Document dDoc = builder.parse("E:/test.xml");

            XPath xPath = XPathFactory.newInstance().newXPath();
            NodeList nl = (NodeList) xPath.evaluate("/root/author", dDoc, XPathConstants.NODESET);
            System.out.println(nl.getLength());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}</code>

이 경우 문서의 네임스페이스가 처리 중에 인식되고 암시되므로 익숙한 XPath 표현식 "/root/author"를 사용할 수 있습니다.

위 내용은 XPath를 사용하여 기본 네임스페이스가 있는 XML 문서를 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.