XElement.Descendants ( “Nodo”) non comportarsi come previsto, restituisce più livelli di Discendenti

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

  •  20-09-2019
  •  | 
  •  

Domanda

Ho un problema. Ho dati XML gerarchici come ad esempio:

<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>

E ho bisogno di ottenere solo fiori (rose, tulipani, Qualunque) SENZA rosso, rosa, bianco (sotto Roses)  Sto utilizzando il seguente codice, ma a causa del fatto che tutti i nodi siano "Nodo" ottengo tutti i livelli di Descendats. Vorrei limitare a un solo livello.

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); 

risultato voluto:

<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>

Grazie,

aggiunta: Forse una query SQL 2008 potrebbe prelevare solo il ramo nodo di cui ho bisogno, ma dopo un sacco di ricerca e sperimentazione, che non riusciva a trovare una risposta ... (La mia XML è in una colonna XML in SQL 2008)

È stato utile?

Soluzione

Quindi abbiamo questa ...

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);

Il modo migliore che ho trovato è stato quello di rimuovere tutti gli elementi figlio dopo aver effettuato la query LINQ. In questo modo:

foreach (XElement xl in procXML.Element("Node").Elements("Node"))
{
    if (xl.HasElements) // just remove the ones without child elements
    {
        xl.RemoveNodes();
    }
}

Questo uscita volontà ciò che avete desiderato, ma devo aggiungere ... C'è più sicuramente un modo migliore per fare questo. Non so quanto bene che possa funzionare con la vostra situazione dato maggior parte delle esigenze di codice scritto per lavorare in modo più dinamico di questo.

Ho visto questa domanda e ha deciso di fare un tuffo in Linq, credo che non era poi così male. Se questo non funziona proprio il modo in cui deve, almeno è un inizio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top