2008-08-25 16 views
11

Ich bin mit XPath in .NET ein XML-Dokument zu analysieren, entlang der Linien von:XPath und Auswählen eines einzelnen Knotens

XmlNodeList lotsOStuff = doc.SelectNodes("//stuff"); 

foreach (XmlNode stuff in lotsOStuff) { 
    XmlNode stuffChild = stuff.SelectSingleNode("//stuffChild"); 
    // ... etc 
} 

Das Problem ist, dass die XPath-Abfrage für stuffChild immer das Kind zurückkehrt von das erste stuff Element, niemals der Rest. Kann XPath nicht verwendet werden, um eine Anfrage an eine Person XMLElement abzufragen?

Antwort

10

// am Anfang eines XPath-Ausdrucks beginnt mit dem Dokumentstamm. Versuchen Sie ".//stuffChild". . ist eine Kurzform für self :: node(), die den Kontext für die Suche festlegt, und // ist eine Abkürzung für die untergeordnete Achse.

So haben Sie:

XmlNode stuffChild = stuff.SelectSingleNode(".//stuffChild"); 

was übersetzt:

xmlnode stuffChild = stuff.SelectSingleNode ("self :: node()/Nachkomme :: stuffChild");

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant-or-self::stuffChild"); 

In dem Fall, dass das Kind-Knoten den gleichen Namen wie die Eltern haben könnte, können Sie die etwas ausführlichere Syntax verwenden wollen würde, die, um sicherzustellen, dass Sie wählen Sie erneut die Eltern nicht folgt:

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant::stuffChild"); 

beachten Sie auch, dass, wenn „stuffChild“ ein direkter Nachkomme von „Stoff“ ist, können Sie vollständig die Präfixe weglassen können, und wählen Sie einfach „stuffChild“.

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild"); 

Die W3Schools Tutorial hat hilfreiche Informationen in einem einfachen Format zu verdauen.

+0

.//foo ist ** nicht ** gleich mit dem Nachkommen :: foo und ist im Allgemeinen ** falsch ** Art der Auswahl von Nachkommen Knoten. Siehe http://stackoverflow.com/questions/453191/ –

+0

Vielleicht haben Sie die., Die den Kontext des folgenden XPath setzt, verpasst? –

+0

Bitte beachten Sie die Dokumentation für die // Abkürzung. .//foo übersetzt zu self :: node()/descendant-or-self :: node()/child :: stuffChild –

2

Die // die Sie vor stuffChild verwenden bedeutet, dass Sie nach stuffChild Elemente suchen, beginnend mit der Wurzel.

Wenn Sie vom aktuellen Knoten (decendants des aktuellen Knotens) beginnen möchten, sollten Sie .// verwenden, wie:

stuff.SelectSingleNode(".//stuffChild"); 
1

Wenn „stuffChild“ ein Kind-Knoten von „Stoff“ ist, dann Ihr xpath sollte nur sein:

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild"); 
-1

Auswahl einzelner Knoten bedeutet, dass Sie nur das erste Element benötigen. Also, die beste Lösung ist:

XmlNode stuffChild = stuff.SelectSingleNode("descendant::stuffChild[1]"); 
Verwandte Themen