XML mit Namespaces in Java unter Verwendung von XPath abfragen
Beim Arbeiten mit XML-Dokumenten, die an Namespaces gebundene Elemente enthalten, kann die Abfrage mit XPath eine Herausforderung darstellen. Betrachten Sie das folgende Beispiel:
Die Verwendung eines standardmäßigen XPath-Ausdrucks „kein Namespace“ wie „/workbook/sheets/sheet[1]“ schlägt fehl. Dies liegt daran, dass die Elemente im XML-Dokument an einen Namespace gebunden sind, der im XPath-Ausdruck nicht berücksichtigt wird.
Lösung 1: Namespace registrieren und Namespace-Präfix verwenden
Der empfohlene Ansatz besteht darin, den Namespace mit einem Namespace-Präfix zu registrieren, wodurch XPath einfacher zu lesen und zu verwalten ist:
NamespaceContext namespaceContext = new NamespaceContext() { @Override public String getNamespaceURI(String prefix) { if (prefix.equals("main")) { return "http://schemas.openxmlformats.org/spreadsheetml/2006/main"; } else if (prefix.equals("r")) { return "http://schemas.openxmlformats.org/officeDocument/2006/relationships"; } return null; } }; XPathFactory xPathFactory = XPathFactory.newInstance(); XPath xPath = xPathFactory.newXPath(); xPath.setNamespaceContext(namespaceContext); NodeList nodes = (NodeList) xPath.evaluate("/main:workbook/main:sheets/main:sheet[1]", document, XPathConstants.NODESET);
Unter Verwendung des Namespace-Präfixes wird der XPath-Ausdruck „/main:workbook/main:sheets/main:sheet[1]“, das an den angegebenen Namespace gebundene Elemente korrekt adressiert.
Lösung 2: Generische Übereinstimmung und Prädikatfilter
Alternativ kann ein XPath-Ausdruck ohne Namespace-Präfix erstellt werden, indem eine generische Übereinstimmung für das Element und ein Prädikatfilter verwendet werden, der den gewünschten local-name() und namespace-uri() angibt:
XPathFactory xPathFactory = XPathFactory.newInstance(); XPath xPath = xPathFactory.newXPath(); NodeList nodes = (NodeList) xPath.evaluate("/*[local-name()='workbook' and namespace-uri()='http://schemas.openxmlformats.org/spreadsheetml/2006/main']" "/*[local-name()='sheets' and namespace-uri()='http://schemas.openxmlformats.org/spreadsheetml/2006/main']" "/*[local-name()='sheet' and namespace-uri()='http://schemas.openxmlformats.org/spreadsheetml/2006/main'][1]", document, XPathConstants.NODESET);
Diese Methode ist ausführlich und kann Risiken bergen, wenn gemischte Vokabulare im XML-Dokument vorhanden sind.
Schlussfolgerung
Beim Umgang mit XML-Dokumenten mit Namespaces ist es wichtig, Namespace-Bindungen zu berücksichtigen. Durch die Registrierung des Namespace mit einem Präfix oder die sorgfältige Erstellung generischer XPath-Ausdrücke können genaue und zuverlässige Abfragen durchgeführt werden.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3