기본 네임스페이스가 있는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!