XElement.Descendants ( „Knoten“) nicht wie erwartet, kehrt verhalten mehrere Ebenen der Nachkommen
Frage
Ich habe ein Problem. Ich habe hierarchische XML-Daten wie zum Beispiel:
<Tree>
<Node Text="Stuff" ItemGUID="064a9bf0-0594-47f8-87be-88dd73763c77" >
<Node Text="Food" ItemGUID="326f1f7a-d364-4838-9bdc-ce5fd93f88ca" ItemType="2" />
<Node Text="Wines" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
<Node Text="Flowers" ItemGUID="cefa8c34-af06-48e7-9c00-4b1422d217a4">
<Node Text="Roses" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f">
<Node Text="Red" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
<Node Text="Pink" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
<Node Text="White" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
</Node>
<Node Text="Tulips" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
<Node Text="Whatever" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
</Node>
<Node Text="Sweet Delights" ItemGUID="1df7dbae-adf0-49a9-aaac-1358468a245b" />
</Node>
</Tree>
Und ich brauche nur Blumen (Rosen, Tulpen, was auch immer) ohne Rot, Rosa, Weiß (unter Rosen) erhalten Ich verwende den folgenden Code, aber aufgrund der Tatsache, dass alle Knoten sind „Node“ Ich alle Ebenen der Descendats bekommen. Ich mag es nur eine Ebene zu begrenzen.
XElement loadedXML = clients.ItemTreeXML;
//filter only current node
XElement procXML;
procXML = new XElement ("Tree",
from el in loadedXML.Descendants("Node")
where (string)el.Attribute("ItemGUID") == currentNodeGUID
select el);
Ergebnis Gesucht:
<Tree>
<Node Text="Flowers" ItemGUID="cefa8c34-af06-48e7-9c00-4b1422d217a4">
<Node Text="Roses" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
<Node Text="Tulips" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
<Node Text="Whatever" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
</Node>
</Tree>
Danke,
Hinzugefügt: Vielleicht eine SQL 2008 Abfrage nur die Knoten Zweig I Notwendigkeit retreive könnte, aber nach vielen Forschung und Tests, konnte ich nicht eine Antwort finden ... (My XML ist in einer XML-Spalte in SQL 2008)
Lösung
So haben wir diese ...
XElement loadedXML = XElement.Load("test.xml");
//filter only current node
XElement procXML;
procXML = new XElement("Tree",
from el in loadedXML.Descendants("Node")
where (string)el.Attribute("ItemGUID") == currentNodeGUID
select el);
Der beste Weg, ich war gefunden alle Kind-Elemente zu entfernen, nachdem Sie die LINQ-Abfrage zu tun. Wie folgt aus:
foreach (XElement xl in procXML.Element("Node").Elements("Node"))
{
if (xl.HasElements) // just remove the ones without child elements
{
xl.RemoveNodes();
}
}
Das wird ausgegeben, was Sie wünschen übrig, aber ich muss hinzufügen, ... Es ist die meisten auf jeden Fall einen besseren Weg, dies zu tun. Ich weiß nicht, wie gut es mit Ihrer Situation der meisten Code geschrieben Bedürfnisse Arbeit dynamischer als dies gegeben arbeiten.
ich diese Frage sah und beschlossen, einen Tauchgang in Linq zu nehmen, ich denke, es war nicht so schlimm. Wenn das nicht nur die Art und Weise funktioniert muss es, zumindest ist es ein Anfang.