在具有默认命名空间的 XML 文档上使用 XPath
处理使用默认命名空间的 XML 文档时,缺少前缀可能会导致XPath 操作具有挑战性。虽然将 namespaceAware 属性设置为 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中文网其他相关文章!