2009-03-27 13 views
5

Vorausgesetzt, dass ich den Namen meines Basisknotens oder seiner untergeordneten Elemente nicht kenne, wie lautet die XPath-Syntax für "alle Knoten genau einen unter dem Basisknoten?"Was ist der richtige XPath für "alle Knoten genau eine unter dem Basisknoten?"

Mit Muster ein XmlNode zu sein, ich habe den folgenden Code:

XmlNodeList kvpsList = pattern.SelectNodes(@"//"); 

Welches Recht sieht für mich, aber ich bekomme die folgende Ausnahme:

System.Xml.XPath.XPathException: Expression must evaluate to a node-set. 

Was ist die korrekte Syntax?

+0

Hinweis für den späteren Leser: durch „Basisknoten“, Jekke meint offenbar das oberste Element (auch bekannt als "Dokumentelement" oder "äußerstes Element").Jekkes Verwendung ist verwirrend, weil er * nicht * den Wurzelknoten (/) meint, der das übergeordnete Element des übergeordneten Elements ist. – LarsH

Antwort

7

Die beiden aktuellen Antworten sind falsch:

/*/* 

nicht alle Knoten auswählt, die Kinder des obersten Knoten sind. Es werden keine Textknoten, Verarbeitungsanweisungen oder Kommentare ausgewählt, die untergeordnete Elemente des obersten Elements sind.

Ein XPath-Ausdruck, der alle Knoten auswählen, die Kinder des oberen Elements arte ist:

/*/node()

// ist kein syntaktisch korrekten XPath-Ausdruck; nach dem XPath Spec:

// ist die Abkürzung für /descendant-or-self :: node()/

Sie den Beginn eines unfertigen Lokalisierungsschritt am Ende beachten der erweiterten Abkürzung. Wenn nichts hinzugefügt wird, ist der gesamte XPath-Ausdruck, der die Abkürzung enthält, fertig und daher syntaktisch falsch.

Noch ein Hinweis ist, dass die // Abkürzung bei der Festlegung der Auswahl aller Knoten nicht erforderlich ist, dass die Kinder des oberen Elements sind. Wenn Sie wollten alle Knoten im XML-Dokument wählen, dass aus dem oberen Element absteigen, dann ein XPath-Ausdruck, wählen Sie diese ist:

/*//node()

8

Der Weg, den Sie suchen ist

/*/* 

// ist kein sinnvoller XPath-Ausdruck, da es ein Operator ist. Wenn Sie etwas wie //element schreiben würden, würde es jedes Element mit dem Namen element irgendwo im XML-Dokument finden, egal wie tief es in der Hierarchie ist.

/*/* sagt "Übereinstimmung mit jedem Knoten, der zwei Ebenen der Tiefe in der Hierarchie hat".

+0

sowohl diese Antwort als auch @ Jweede's verwechseln die Begriffe "Knoten" und "Element". Ich vermute, @Jekke hat auch die Begriffe durcheinandergebracht, also sind diese Antworten in Bezug auf das, was er meinte, richtig, aber nicht in Bezug auf das, was er gesagt hat. "Knoten" enthalten Elemente, Attribute, Textknoten, Stammknoten und andere. Elemente sind die Dinge, die mit Start-/End-Tags ausgedrückt werden: ' '. Der XPath "*" ohne angegebene Achse stimmt nur mit * Elementen * überein. Siehe @ Dimitres Antwort für mehr dazu. – LarsH