>  기사  >  Java  >  XPath를 사용할 때 기본 네임스페이스로 XML 문서를 처리하는 방법은 무엇입니까?

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

Patricia Arquette
Patricia Arquette원래의
2024-10-24 06:23:01838검색

How to Handle XML Documents with Default Namespace When Using XPath?

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

기본 네임스페이스를 사용하는 XML 문서를 처리할 때 접두사가 없으면 XPath 조작이 어렵습니다. 네임스페이스Aware 속성을 false로 설정하는 것은 해결책처럼 보일 수 있지만 한계가 있습니다.

이러한 문서를 효과적으로 조작하려면 다음을 고려해야 합니다.

네임스페이스 컨텍스트 사용

네임스페이스에 적합한 문서로 작업할 때 XPath 평가 중에 NamespaceContext를 사용할 수 있습니다. 이 컨텍스트를 사용하면 네임스페이스 URI에 대한 접두사를 지정할 수 있습니다. 컨텍스트에 사용된 접두사가 문서의 접두사와 일치할 필요는 없지만 XPath의 조각에는 그에 따라 접두사가 추가되어야 합니다.

예를 들어 다음 코드를 고려하세요.

<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>

참고: XPath 표현식 "/ns:root/ns:author"는 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();
        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를 사용할 때 기본 네임스페이스로 XML 문서를 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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