Beim Arbeiten mit XML, das Namespaces verwendet, können XPath-Abfragen, die Namespaces ignorieren, zu falschen Übereinstimmungen führen. In Szenarien, in denen die XML-Elemente an einen bestimmten Namespace gebunden sind, ist es wichtig, den Namespace in XPath-Ausdrücken zu berücksichtigen.
Der bevorzugte Ansatz besteht darin, ein Namespace-Präfix explizit zu deklarieren Verweisen Sie in Ihren XPath-Abfragen darauf. Dies verbessert die Lesbarkeit und Wartbarkeit des Codes. Zum Beispiel:
NamespaceContext namespaceContext = new NamespaceContext(); namespaceContext.addNamespace("x", "http://schemas.example.com/x"); XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); xpath.setNamespaceContext(namespaceContext); NodeList nodes = (NodeList)xpath.evaluate("/x:workbook/x:sheets/x:sheet[1]", doc, XPathConstants.NODESET);
Alternativ ist es möglich, einen XPath-Ausdruck zu erstellen, der Elemente generisch abgleicht und Prädikate verwendet, um Ergebnisse basierend auf ihrem lokalen Namen und Namespace zu filtern -uri. Obwohl dieser Ansatz ausführlich sein mag, ermöglicht er mehr Flexibilität:
XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); Item node = (Item)xpath.evaluate("//*[local-name()='workbook' and namespace-uri()='http://schemas.example.com/x']", doc, XPathConstants.NODE);
Als letzten Ausweg können Sie Elemente ausschließlich anhand ihres lokalen Namens abgleichen und ignorieren der Namensraum. Dieser Ansatz birgt jedoch das Risiko, dass falsche Elemente in Szenarien gefunden werden, in denen mehrere Vokabulare mit ähnlichen lokalen Namen im XML vorhanden sind:
XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); Item node = (Item)xpath.evaluate("//*[local-name()='workbook']", doc, XPathConstants.NODE);
Das obige ist der detaillierte Inhalt vonWie frage ich XML mit Namespaces mithilfe von XPath in Java ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!