2010-10-22 9 views
10

ein Buch, das ich auf XML lesen sagt, dass alle Knoten in einer XML-Datei auszuwählen, die ein bestimmtes Attribut haben, verwenden Sie die Syntax:XPath-Ausdruck alle Knoten mit einem gemeinsamen Attribut für die Auswahl

//*/@_attribute_ 

Was ich versteh nicht, warum das Sternchen benötigt wird. Wie ich es verstehe, wählt der Ausdruck // alle Nachkommen des Wurzelknotens. Also, würde zB // @ lang nicht alle Nachkommen des Wurzelknotens auswählen, die ein Attribut namens "lang" haben? Ich kann nicht einmal interpretieren, was der Stern im obigen Ausdruck bedeutet (ich weiß, dass der Stern im Allgemeinen "alles" bedeutet). Wenn jemand es für mich brechen könnte, würde ich es sehr schätzen.

Dank

+0

Gute Frage, +1.Sehen Sie meine Antwort für eine kleine Korrektur von @ Alejandros Aussage, dass Ihr XPath-Ausdruck "falsch" ist. @ Alejandros Antwort ist eine gute, mit der Ausnahme, dass an diesem XPath-Ausdruck nichts falsch ist. –

Antwort

14

Hallo, ein Buch, das ich auf XML gerade lese, sagt , dass alle Knoten in einer XML-Datei , die ein bestimmtes Attribut auszuwählen, die Syntax:

//*/@attribute

Das ist falsch.

/descendant-or-self::node()/child::*/attribute::attribute 

Bedeutung: Alle attribute Attribute jedes Element Kind eines der Wurzel Dokument selbst oder einer seiner descendats

Sie müssen sein Knoten:

/descendant::*[attribute::attribute] 
Es wird erweitert

Oder die Abkürzung

//*[@attribute] 

Über die *: formaly ist ein Name Test kein Knoten Typ Test. In XPath 1.0 gibt es keinen Elementtyptest. In XPath 2.0 haben Sie element(). Also, warum nur Elemente auswählen? Nun, das tut es nicht. Die Achse hat einen Hauptknotentyp, von http://www.w3.org/TR/xpath/#node-tests:

Jede Achse hat einen Hauptknotentyp. Wenn eine Achse Elemente enthalten kann, ist der Hauptknotentyp element; anderenfalls ist es die Art der Knoten , die die Achse enthalten kann. Somit

  • Für die Attributachse ist der Hauptknotentyp Attribut.
  • Für die Namespace-Achse ist der Hauptknotentyp der Namespace.
  • Bei anderen Achsen ist der Hauptknotentyp element.

Deshalb *, child::*, self::*, descendant::* usw. Elemente auswählt, aber @* oder attribute::* oder namespace::* wählt Attribute oder in ihrem Umfang Namensräume.

Über Prädikat (der [@attribute] Teil): Dieser Ausdruck wird mit jedem der Knoten ausgewertet, die vom letzten Schritt ausgewählt werden. Es erwartet einen booleschen Wert für die Filterung. Der boolesche Wert für einen Knotensatz (dies ist das Ergebnis für attribute::attribute) ist für einen leeren Knotensatz falsch und andernfalls wahr.

+0

@ Alejandro. Es gibt * nichts * falsch mit '// */@ x', außer dass es länger ist als es sein könnte. –

12

Der Titel dieser Frage ist:

XPath-Ausdruck für die Auswahl aller Knoten mit einem gemeinsamen Attribute

aber nirgends wird der Text der Frage diskutieren, wie tho alle Knoten finden die ein gemeinsames Attribut haben - daher könnte der Titel falsch sein.

Um alle Knoten zu finden, die ein gemeinsames Attribut mit dem Namen haben x (BTW, nur Element-Knoten können Attribute haben), Verwendung:

//*[@x] 

Verwendung:

//@x 

, um alle Attribute mit dem Namen x im XML-Dokument auszuwählen. Dies ist wahrscheinlich der kürzeste Ausdruck dafür.

Es ist nichts falsch mit:

//*/@x 

außer dass es etwas länger ist.

Es ist eine Abkürzung für:

/descendant-or-self::node()/child::*/attribute::x 

und wählt auch alle x Attribute im XML-Dokument.

Jemand könnte denken, dass dieser Ausdruck nicht das x Attribut des obersten Elements im Dokument auswählt. Dies ist eine falsche Schlussfolgerung, weil der erste Lokalisierungsschritt:

/descendant-or-self::node() 

wählt jeden Knoten in dem Dokument, einschließlich der Wurzel (/) selbst ist. Diese

bedeutet:

/descendant-or-self::node()/child::* 

jedes Element auswählt, einschließlich des oberen Elements (das das einzige Kind des Wurzelknotens in einem wohlgeformten XML-Dokument).

Also, wenn der letzte Ort Schritt /@x schließlich hinzugefügt wird, das bisher durch die ersten beiden Schritte Standort ausgewählt alle x Attribute aller Knoten wählen wird - das heißt alle x Attribute aller Element-Knoten in der XML Dokument.

+2

+1 Danke für die Klarstellung. Ich genieße es immer, deine Antworten zu lesen. – Garett

Verwandte Themen