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.
Es gibt Mehrere Möglichkeiten, Namespaces in XPath-Abfragen zu verarbeiten:
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]
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.
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!