„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie frage ich XML mit Namespaces in Java mithilfe von XPath ab?

Wie frage ich XML mit Namespaces in Java mithilfe von XPath ab?

Veröffentlicht am 10.11.2024
Durchsuche:942

How to Query XML with Namespaces in Java Using XPath?

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.

Neuestes Tutorial Mehr>

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