2008-08-25 17 views
11

Używam XPath w .NET do analizowania dokumentu XML, wzdłuż linii:XPath i wybór pojedynczy węzeł

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

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

problem jest, że zapytań XPath dla stuffChild zawsze zwraca dziecku pierwszy element stuff, nigdy reszta. Czy XPath nie może być użyty do zapytania przeciwko indywidualnemu XMLElement?

Odpowiedz

10

// na początku wyrażenia XPath rozpoczyna się od głównego katalogu dokumentu. Spróbuj ".//stuffChild". . jest skrótem dla self :: node(), który ustawi kontekst dla wyszukiwania, a // jest skrótem dla osi potomnej.

Więc trzeba:

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

co przekłada się na:

XmlNode stuffChild = stuff.SelectSingleNode ("self :: node()/potomek :: stuffChild");

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

W przypadku, gdy węzeł dziecko może mieć taką samą nazwę jak rodzic, co chcesz użyć nieco bardziej rozwlekły składni, który następuje, w celu zapewnienia, że ​​nie ponownie wybrać rodzica:

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

Należy również pamiętać, że jeśli „stuffChild” jest bezpośrednim potomkiem „rzeczy”, można całkowicie pominąć przedrostki i po prostu wybrać „stuffChild”.

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

Samouczek W3Schools zawiera przydatne informacje w łatwym do zrozumienia formacie.

+0

.//foo jest ** nie ** równe potomkowi :: foo i ogólnie jest ** błędne ** sposób wybierania węzłów potomnych. Zobacz http://stackoverflow.com/questions/453191/ –

+0

Być może przegapiłeś., Który określa kontekst następnej ścieżki XPath? –

+0

Proszę zapoznać się z dokumentacją // skrótu. .//foo tłumaczy na self :: node()/descendent-or-self :: node()/child :: stuffChild –

2

Numer //, którego używasz przed numerem stuffChild oznacza, że ​​szukasz elementów stuffChild, zaczynając od katalogu głównego.

Jeśli chcesz zacząć od bieżącego węzła (decendants bieżącego węzła), należy użyć .//, jak w:

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

Jeśli „stuffChild” jest węzłem podrzędnym „rzeczy”, a następnie Twoja ścieżka xpath powinna być:

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

Wybór pojedynczego węzła oznacza, że ​​potrzebny jest tylko pierwszy element. Najlepszym rozwiązaniem jest:

Powiązane problemy