2009-10-28 2 views
8

Ho una collezione di oggetti IEnumerables e ognuno ha un valore di attributo diverso che corrisponde a una proprietà diversa sul mio oggetto business. Ecco un esempio di XML che sto l'interrogazione contro:Trova XElement per valore attributo

<SimpleData name="zip">60004</SimpleData> 
    <SimpleData name="name">ARLINGTON HEIGHTS</SimpleData> 
    <SimpleData name="state">IL</SimpleData> 
    <SimpleData name="countyname">COOK</SimpleData> 
    <SimpleData name="lat">42.1121336684356</SimpleData> 
    <SimpleData name="lon">-87.9736682731814</SimpleData> 

Penso che il mio linq2xml lambda è vicino (dopo aver cercato MSDN e SO), ma io non riesco a modificarlo giusto:

string cityName = simpleData.Where(a => a.Attribute("name").Value == "name").Select(a => a.Value).ToString(); 

Il valore del nome della città di avere assegnato a "System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [System.Xml.Linq.XElement, System.String]" invece di Arlington Heights

Qualche suggerimento? Grazie

risposta

16
string cityName = (simpleData.Where(a => a.Attribute("name").Value == "name") 
        .Select(a => a.Value)).FirstOrDefault(); 

o

(from x in simpleData 
where x.Attribute("name").Value == "name" 
select x.Value).FirstOrDefault() 

che restituisce un IEnumerable<string> (metodi di estensione Linq quasi sempre tornare collezioni e le istanze non singoli) che contengono tutti i valori degli elementi il ​​cui attributo name uguale name. Quindi prendiamo il primo, o null se è vuoto.

Inoltre, quell'XML è orrendo e dovrebbe essere sparato.

+6

+1 per che XML dovrebbe essere girato! – CoderDennis

+5

Suggerirei di usare l'attributo '(stringa) (" nome ")' su Attributo ("nome"). Valore' - è la stessa cosa, eccetto che prima fa un controllo null. Dato che 'Attribute()' restituisce 'null' quando nessun attributo con tale nome si chiude su un elemento, il primo di tali elementi innescherebbe una' NullReferenceException' nella query come attualmente scritta. –

+0

Dannazione, sapevo che era solo una piccola cosa che mi mancava, aggiungendo FirstOrDefault. Grazie. Non c'è molto che posso fare per XML, è una fonte di importazione di dati di terze parti. –

3

Se avete l'XML:

<SimpleDataList> 
    <SimpleData name="zip">60004</SimpleData> 
    <SimpleData name="name">ARLINGTON HEIGHTS</SimpleData> 
    <SimpleData name="state">IL</SimpleData> 
    <SimpleData name="countyname">COOK</SimpleData> 
    <SimpleData name="lat">42.1121336684356</SimpleData> 
    <SimpleData name="lon">-87.9736682731814</SimpleData> 
</SimpleDataList> 

caricato nel XElement/XDocument SimpleDataList, è possibile interrogare con XPath:

SimpleDataList.XPathSelectElement(@"//SimpleDataList/SimpleData[@Name=""name""]"); 

Ma io non sono sicuro se si dispone di un XElement a inizia con o un semplice oggetto IEnumerable ... In ogni caso .. ho pensato di menzionare XPath nel caso in cui ti aiuti.

+1

Non ha molto senso usare XPath per interrogare 'XDocument', poiché è specificamente adattato a LINQ. Anche XPath sarà leggermente più lento (perché è una stringa che deve essere analizzata per prima). –