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
Mary-Kate OlsenOriginal
2024-11-11 08:21:03197Durchsuche

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>

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

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

/xssf:workbook/xssf:sheets/xssf:sheet[1]

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]

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]

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!

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