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

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

Susan Sarandon
Susan SarandonOriginal
2024-11-17 08:27:03779Durchsuche

How to Query XML with Namespaces in Java Using XPath?

XML mit Namespaces in Java mithilfe von XPath abfragen

Bei der Arbeit mit XML-Dokumenten, die Elemente enthalten, die an Namespaces gebunden sind, kann die Abfrage mit XPath eine Herausforderung darstellen. Betrachten Sie das folgende Beispiel:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
    <sheets>
        <sheet name="Sheet1" sheetId="1" r:id="rId1"/>
    </sheets>
</workbook>

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, um XPath leichter lesbar und pflegeleicht zu machen:

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);

Mit dem Namespace-Präfix wird der XPath-Ausdruck zu „/main:workbook/main:sheets/“ main:sheet[1]“, der an den angegebenen Namespace gebundene Elemente korrekt adressiert.

Lösung 2: Generische Übereinstimmung und Prädikatfilter

Alternativ ein XPath-Ausdruck ohne Ein Namespace-Präfix kann mithilfe einer generischen Übereinstimmung für das Element und eines Prädikatfilters erstellt 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 präsentieren Risiken, wenn gemischte Vokabulare im XML-Dokument vorhanden sind.

Fazit

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.

Das obige ist der detaillierte Inhalt vonWie frage ich XML mit Namespaces in Java mithilfe von XPath ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn