Verwenden von XPath für XML-Dokumente mit Standard-Namespace
Beim Umgang mit XML-Dokumenten, die einen Standard-Namespace verwenden, kann das Fehlen eines Präfixes problematisch sein XPath-Manipulation schwierig. Auch wenn das Setzen der Eigenschaft „namespaceAware“ auf „false“ wie eine Lösung erscheinen mag, hat sie doch ihre Grenzen.
Um solche Dokumente effektiv zu manipulieren, muss man Folgendes berücksichtigen:
Verwendung eines Namespace-Kontexts
Beim Arbeiten mit Namespace-qualifizierten Dokumenten kann während der XPath-Auswertung ein NamespaceContext verwendet werden. In diesem Kontext können Sie Präfixe für Namespace-URIs angeben. Während die im Kontext verwendeten Präfixe nicht mit denen im Dokument übereinstimmen müssen, müssen die Fragmente im XPath entsprechend vorangestellt werden.
Betrachten Sie beispielsweise den folgenden Code:
<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>
Hinweis:Der XPath-Ausdruck „/ns:root/ns:author“ verwendet Präfixe, die mit dem NamespaceContext konsistent sind.
Alternativer Ansatz
In einigen Fällen Der folgende Ansatz könnte ebenfalls effektiv sein:
<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>
Hinweis: Bei diesem Ansatz wird davon ausgegangen, dass der Standard-Namespace nicht an anderer Stelle im Dokument verwendet wird.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit XML-Dokumenten mit Standard-Namespace um, wenn XPath verwendet wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!