XElement.Descendants ( „Knoten“) nicht wie erwartet, kehrt verhalten mehrere Ebenen der Nachkommen

StackOverflow https://stackoverflow.com/questions/1753518

  •  20-09-2019
  •  | 
  •  

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)

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top