2012-05-30 5 views
5

Wie lautet der XPath-Ausdruck alle Elemente, Textknoten und Kommentarknoten in der Reihenfolge, in der sie im Dokument erscheinen?XPath-Ausdruck zur Auswahl von * allen * Elementen, Textknoten und Kommentarknoten in Quellreihenfolge

Die folgende wählt effektiv alle Elemente, aber nicht Textknoten und Kommentarknoten:

var result = document.evaluate('//*', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null), 
    index = -1; 
while (++index < result.snapshotLength) { 
    console.log(result.snapshotItem(index)); 
} 

Ist es möglich, so etwas wie die folgenden zu tun? (Hinweis: Dies ist ein nicht-funktionaler Pseudo-Code.)

document.evaluate('//* and text() and comment()'); 

Antwort

5
//node() 

jeden Knoten auswählt, die ein Kind von etwas ist: dh alle Elemente, Textknoten, Kommentare und Verarbeitungsanweisungen (aber keine Attribute, Namespace-Knoten oder Dokumentknoten)

+0

Woah! Kurz und bündig. Das funktioniert großartig; es wählt auch das Wurzelelement aus - und für HTML-Dokumente sogar den DOCTYPE (den ich nicht kannte, war möglich). –

+0

TIL dass 'document.evaluate ('// node()', Dokument, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null) .singleNodeValue === document.doctype'. –

+1

Wenn es einen DOCTYPE-Knoten auswählt, hat jemand die XPath-Spezifikation imaginär interpretiert; Es gibt keinen solchen Knoten im XPath-Datenmodell. –

1

Getestet mit Text- und Kommentarknoten in einem XML-Dokument. Es kann ein effizienter Ansatz, aber das gibt Elemente, Text und Kommentar Knoten in Dokumentreihenfolge für mich, mit Gewerkschaft:

//*|//*/text()|//*/comment() 
+0

Die Frage bezieht sich auf HTML (nicht unbedingt XML), also können Sie es einfach in der Konsole auf dieser Stack Overflow-Seite ausprobieren, z Beispiel. Das heißt, Ihre Antwort scheint gut zu funktionieren. Als XPath n00b wusste ich nichts über '|' - danke! –

+1

Ah, in diesem Fall willkommen zu '|' als 'union', und die sofortige Einschränkung, dass in XPATH 1.0 es nur von der Wurzel der Abfrage gilt, können Sie es nicht von der Mitte durch einen "Pfad" verwenden. – MattH

+2

Oh, und eine gute Möglichkeit, Ihr XPATH-Wissen zu bootstrappen, ist, einige der Antworten der Top-Benutzer auf das Tag zu überprüfen: http://stackoverflow.com/tags/xpath/topusers – MattH

Verwandte Themen