2010-12-13 20 views
0

In einem XML-Dokument zu finden, wie die folgenden:Wie Knoten vollständig zwischen zwei bestimmten Knoten

<root> 
    <fish value="Start"/> 
    <pointlessContainer> 
    <anotherNode value="Pick me!"/> 
    <anotherNode value="Pick me too!"/> 
    <fish value="End"/> 
    </pointlessContainer> 
</root> 

Wie kann ich das Wunder von LINQ to XML verwenden, um alle Knoten zu finden vollständig durch die fish Knoten enthalten ? Beachten Sie, dass ich in diesem Beispiel die Knoten fish absichtlich auf verschiedenen Ebenen im Dokument platziert habe, da ich davon ausgehe, dass dieses Szenario in der freien Wildbahn auftreten wird.

Offensichtlich würde ich in diesem Beispiel die beiden anotherNode Knoten, aber nicht die pointlessContainer Knoten suchen.

NB: die zwei "begrenzenden" Knoten können denselben Typ haben (z. B. fish) wie andere nicht-begrenzende Knoten im Dokument, aber sie würden eindeutige Attribute haben und daher leicht zu identifizieren sein.

+0

Könnte es Knoten geben, die * höher * im Baum sind als der "Start" -Knoten? –

+0

Oh, meinst du, wenn die Start- und Endknoten auf verschiedenen Zweigen sind? Daran hatte ich nicht gedacht. Ich nehme an, technisch könnte es möglich sein. tbh Ich weiß nicht genug über diesen Geschmack von XML (WordML), um sicher zu sein. – David

+0

Ich halte es für sehr unwahrscheinlich, obwohl mich nichts über MS Office-Formate überraschen würde. – David

Antwort

0

Für Ihre Probe sollte die folgenden

 XDocument doc = XDocument.Load(@"..\..\XMLFile2.xml"); 
     XElement start = doc.Descendants("fish").First(f => f.Attribute("value").Value == "Start"); 
     XElement end = doc.Descendants("fish").First(f => f.Attribute("value").Value == "End"); 
     foreach (XElement el in 
      doc 
      .Descendants() 
      .Where(d => 
       XNode.CompareDocumentOrder(d, end) == -1 
       && XNode.CompareDocumentOrder(d, start) == 1 
       && !end.Ancestors().Contains(d))) 
     { 
      Console.WriteLine(el); 
     } 

tun, aber ich habe nicht getestet oder überlegte gründlich, ob es auch für andere Fälle funktioniert. Vielleicht können Sie nach einigen Ihrer Beispieldaten suchen und zurückmelden, ob es funktioniert.

+0

Mit etwas so Kompliziertem wie diesem, werde ich für einige ernsthafte Komponententests gehen, also werde ich Sie wissen lassen, ob es ihnen passiert, wenn ich sie geschrieben habe! – David

+0

Hmm. Ich kann sehen, was dein Code macht. Und danke, es hätte Stunden gedauert, Methoden wie XNode.CompareDocumentOrder() zu finden. Vielen Dank! – David

Verwandte Themen