Heim > Java > javaLernprogramm > Wie gehen Sie mit Namespaces in XPath-Abfragen um, wenn Ihr XML sie enthält?

Wie gehen Sie mit Namespaces in XPath-Abfragen um, wenn Ihr XML sie enthält?

Mary-Kate Olsen
Freigeben: 2024-11-11 08:21:03
Original
196 Leute haben es durchsucht

How do you handle namespaces in XPath queries when your XML contains them?

XPath-Abfragen in Java, wenn XML Namespaces enthält

In Fällen, in denen Ihr XML Namespaces enthält, wie in diesem 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>
Nach dem Login kopieren

Bei der Verwendung von XPath-Abfragen wie „/workbook/sheets/sheet[1]“ können Probleme auftreten. Dies liegt daran, dass die Elemente an einen Namespace gebunden sind und Ihr XPath nach Elementen im standardmäßigen, anonymen Namespace sucht.

Namespace-Handhabungsoptionen

Es gibt Mehrere Möglichkeiten, Namespaces in XPath-Abfragen zu verarbeiten:

Bevorzugte Methode: Registrieren des Namespace bei a Präfix

Der empfohlene Ansatz besteht darin, den Namespace mit einem Präfix zu registrieren. Dies vereinfacht die XPath-Entwicklung und -Wartung:

NamespaceContext namespaceContext = new NamespaceContext() {
  @Override
  public String getNamespaceURI(String prefix) {
    if ("xssf".equals(prefix)) {
      return "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
    }
    return null;
  }

  @Override
  public String getPrefix(String namespaceURI) {
    return null;
  }

  @Override
  public Iterator getPrefixes(String namespaceURI) {
    return null;
  }
};

XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setNamespaceContext(namespaceContext);
Nach dem Login kopieren

Mit diesem Setup können Sie vereinfachte XPath-Abfragen verwenden:

/xssf:workbook/xssf:sheets/xssf:sheet[1]
Nach dem Login kopieren

Generic Match with Predicate Filter

Wenn Sie keine Namespace-Präfixe verwenden möchten, können Sie XPath-Ausdrücke erstellen, die eine generische Übereinstimmung mit a verwenden Prädikatfilter:

/*[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]
Nach dem Login kopieren

Diese Methode führt zu ausführlichen XPath-Ausdrücken, die möglicherweise schwer zu lesen und zu verwalten sind.

Local-Name-Only Match

Sie können Namespaces auch ignorieren, indem Sie sie nur auf der lokalen Ebene abgleichen name:

/*[local-name()='workbook']/*[local-name()='sheets']/*[local-name()='sheet'][1]
Nach dem Login kopieren

Bei diesem Ansatz besteht jedoch das Risiko, dass bei gemischten Vokabularien, die in verschiedenen Namespaces dieselben lokalen Namen verwenden, die falschen Elemente ausgewählt werden.

Das obige ist der detaillierte Inhalt vonWie gehen Sie mit Namespaces in XPath-Abfragen um, wenn Ihr XML sie enthält?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage