在具有預設命名空間的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中文網其他相關文章!