Wie funktioniert XPath Umgang mit XML-namespaces?
Wie funktioniert XPath Umgang mit XML-namespaces?
Wenn ich
/IntuitResponse/QueryResponse/Bill/Id
Parsen das XML-Dokument unten bekomme ich 0 Knoten zurück.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3"
time="2016-10-14T10:48:39.109-07:00">
<QueryResponse startPosition="1" maxResults="79" totalCount="79">
<Bill domain="QBO" sparse="false">
<Id>=1</Id>
</Bill>
</QueryResponse>
</IntuitResponse>
Allerdings bin ich nicht der Angabe des namespace der XPath (d.h. http://schema.intuit.com/finance/v3
ist kein Präfix von jedem token des Pfades). Wie kann XPath wissen, welche Id
ich wollen, wenn ich sage es nicht explizit? Ich vermute, in diesem Fall (da es nur einen namespace) XPath konnte man mit ignorieren der xmlns
ganz. Aber wenn es mehrere namespaces, die Dinge könnten hässlich werden.
Ihre XPath-sollte nicht wieder jeder node : INFO - XPath-0 zurückgegeben Elemente (zusammengestellt in 0ms, bewertet in 1ms). Wie haben Sie die Ausführung der XPath?
Ich habe es in Java mit Hilfe von import
Gute Frage! XPath selbst bietet keine Methode zum festlegen eines default-namespace oder die Bindung eines namespace-Präfix für einen namespace. Glücklicherweise jedoch, hosting-Sprachen und-Bibliotheken tun. Siehe meine Antwort weiter unten für details...
Nicht ganz sicher, warum die Frage sollte sein, von Ihnen positiv bewertet werden, so hoch, als es gebeten wurde, und antwortete 1000 mal vor....
Ich war beeindruckt von dieser Frage, weil, im Gegensatz zu den meisten vorherigen askers, dass Adam nicht nur ein minimale reproduzierbare Beispiel, er spürte und vermittelt die Notwendigkeit für XPath Umgang mit XML-namespaces irgendwie. Die meisten, die solche Fragen nur post, die einen XPath, vielleicht einige XML - (und wenn wir Glück haben, ist es nicht ein Bild oder ein link zu einem gigantischen off-site-resource), und behaupten, dass es "nicht funktioniert." Adam spürte, es hatte damit zu tun, namespaces, nagelte den Titel, und schrieb das, was ich als eine Frage verdient eine kanonische Antwort.
Ich habe es in Java mit Hilfe von import
javax.xml.xpath.XPath
. Ich Stimme zu, es funktioniert nicht mit einem online-tester. Das war einer der verwirrenden Dinge.Gute Frage! XPath selbst bietet keine Methode zum festlegen eines default-namespace oder die Bindung eines namespace-Präfix für einen namespace. Glücklicherweise jedoch, hosting-Sprachen und-Bibliotheken tun. Siehe meine Antwort weiter unten für details...
Nicht ganz sicher, warum die Frage sollte sein, von Ihnen positiv bewertet werden, so hoch, als es gebeten wurde, und antwortete 1000 mal vor....
Ich war beeindruckt von dieser Frage, weil, im Gegensatz zu den meisten vorherigen askers, dass Adam nicht nur ein minimale reproduzierbare Beispiel, er spürte und vermittelt die Notwendigkeit für XPath Umgang mit XML-namespaces irgendwie. Die meisten, die solche Fragen nur post, die einen XPath, vielleicht einige XML - (und wenn wir Glück haben, ist es nicht ein Bild oder ein link zu einem gigantischen off-site-resource), und behaupten, dass es "nicht funktioniert." Adam spürte, es hatte damit zu tun, namespaces, nagelte den Titel, und schrieb das, was ich als eine Frage verdient eine kanonische Antwort.
InformationsquelleAutor Adam | 2016-11-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Definition von namespaces in XPath (empfohlen)
XPath sich nicht zu binden, ein namespace-prefix die mit einem namespace. Solche Einrichtungen vorgesehen sind, durch die hosting-Bibliothek.
Es wird empfohlen, dass Sie diese Anlagen und definieren der namespace-Präfixe, die dann verwendet werden kann, um sich zu qualifizieren XML-element-und Attributnamen als notwendig.
Hier sind einige der verschiedenen Mechanismen, die die XPath-Gastgeber bieten für die Angabe von namespace-Präfix Bindungen zu namespace-URIs:
XSLT:
Perl (LibXML):
Python (lxml):
Python (ElementTree):
Java (SAX):
Java (XPath):
DocumentBuilderFactory.setNamespaceAware(true)
.Java XPath: Abfragen mit default-namespace xmlns
xmlstarlet:
JavaScript:
Sehen Implementierung einer Benutzer-Definierten Namespace-Resolver:
PhP:
Angepasst @Tomalak Antwort mit DOMDocument:
Siehe auch @IMSoP der kanonische Q/A auf PHP SimpleXML-namespaces.
C#:
VBA:
VB.NET:
Ruby (Nokogiri):
Beachten Sie, dass Nokogiri unterstützt das entfernen von namespaces,
jedoch die untenstehenden Warnungen Hindernisse für die Manipulation von XML-namespaces.
Einmal haben Sie erklärt, ein namespace-Präfix, Ihre XPath geschrieben werden können, es zu benutzen:
Besiegen namespaces in XPath (nicht empfohlen)
Alternative ist zu schreiben, Prädikate, die testen gegen
local-name()
:Oder, in XPath 2.0:
Sockelleisten namespaces in dieser Weise funktioniert, ist aber nicht empfohlen, da es
Fehl zu unterscheiden zwischen-element - /Attribut-Namen in den verschiedenen
namespaces (der eigentliche Zweck von namespaces). Beachten Sie, dass dieses Anliegen in Angriff genommen werden könnten, indem Sie eine zusätzliche Prädikat überprüfen Sie die namespace-URI explizit1:
1Dank Daniel Haley für die
namespace-uri()
Hinweis.Ist übermäßig ausführlich.
pugi: NC-Erklärung in den docs + merkwürdiges Verhalten Beobachtung = drehen und laufen / Leben zu kurz. Javax: vergessen Sie nicht, rufen Sie
setNamespaceAware(true)
auf derDocumentBuilderFactory
.Stellt sich heraus, pugixml nicht die Unterstützung von xml-namespaces (stackoverflow.com/questions/1042855/...). Drehen und laufen.
Sorry, VBA, war eines der wenigen Beispiele, ich würde noch nicht vorhanden. Behoben durch hinzufügen jetzt. Beachten Sie, dass nicht qualifizierte Attribut-Namen werden nicht automatisch in den Standard-namespace angegeben Vorfahren-Elemente. Ich habe wiedereröffnet, auf Ihre andere Frage, denn außer diesem detail, Sie würden bereits einen Anteil für die namespaces richtig. Lassen Sie mich hier wissen, wenn ich helfen kann, im Allgemeinen mit XPath und namespaces oder mehr auf Ihre Frage, ob das zu dem Thema. Danke.
Danke, sehr hilfreich.
InformationsquelleAutor kjhughes