Verwenden von XPath für XML-Dokumente mit einem Standard-Namespace
Beim Bearbeiten von XML-Dokumenten mit einem Standard-Namespace und ohne Präfix ist es möglich, XPath zu verwenden ohne den Namespace-URI, als ob kein Namespace vorhanden wäre. Es reicht jedoch möglicherweise nicht immer aus, die namespaceAware-Eigenschaft von DocumentBuilderFactory auf „false“ zu setzen.
Um XPath erfolgreich für solche Dokumente zu verwenden, können Sie beim Ausführen des XPath einen NamespaceContext verwenden. Dazu gehört es, den XPath-Fragmenten ein Präfix voranzustellen, damit sie mit dem NamespaceContext übereinstimmen. Die verwendeten Präfixe müssen nicht mit denen im Dokument übereinstimmen.
Hier ist eine aktualisierte Version Ihres Codes, die diesen Ansatz beinhaltet:
<code class="java">import java.util.Iterator; 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>
Beachten Sie, dass auch der XPath-Ausdruck korrigiert wurde , gemäß Dennis' Vorschlag.
Alternativ könnte auch das folgende vereinfachte Code-Snippet funktionieren:
<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>
Das obige ist der detaillierte Inhalt vonWann sollte XPath für XML-Dokumente mit einem Standard-Namespace verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!