/ / Query Linq su XML per selezionare più elementi di sottonodi - c #, xml, linq

Query Linq su XML per selezionare più elementi di sottonodi - c #, xml, linq

Voglio selezionare tutti i valori distinti di child dal seguire xml

<root>
<parent>
<child>value 1</child>
<child>value 2</child>
</parent>
<parent>
<child>value 1</child>
<child>value 4</child>
</parent>
</root>

Ho provato a seguire:

var vals  = (from res in XmlResources.Elements("root").Elements("parent") select res)
.SelectMany(r => r.Elements("child")).Distinct().ToList();

Ma non può ricavarne il valore, mi dà un valore racchiuso tra tag e non distinti

È possibile mostrare entrambi i modi per ottenerlo: query e concatenamento aka lambda.

risposte:

1 per risposta № 1

sì, è possibile in entrambi i modi

var doc = new XDocument("your xml string");
var values = (from c in doc.Root.Descendants("child") select c.Value).Distinct();

// stile di concatenamento

var values = doc.Root.Descendants("child").Select(c=>c.Value).Distinct();

2 per risposta № 2

Stai selezionando gli elementi, e il elementi sono tutti distinti. Devi ottenere il distinto valori. Per esempio:

var values = XmlResources.Element("root")
.Elements("parent")
.Elements("child")
.Select(x => x.Value)
.Distinct();

Non c'è davvero alcun vantaggio nell'utilizzare un'espressione di query qui - aggiunge solo cruft. Io uso solo un'espressione di query quando la query ha molteplici aspetti (ad es. e una selezione significativa, o un join). Per solo una selezione o solo un dove è abbastanza inutile, quindi sì, puoi usare:

var values = (from x in XmlResources.Element("root")
.Elements("parent")
.Elements("child")
select x.Value).Distinct();

... ma perché dovresti? È molto meno chiaro IMO.

Nota che se non ti preoccupi troppo della gerarchia radice / genitore / figlio, e sei felice di averlo tutti il child discendenti, puoi usare:

var values = XmlResources.Descendants("child")
.Select(x => x.Value)
.Distinct();