2015-12-01 16 views
6
<X version="1.0"> 
    <Y id="abc" abv="a"/> 
    <Y id="edf" abv="e"/> 
</X> 

Desidero selezionare il nodo il cui id è "abc" e restituire il suo abv "a".usa LINQ su XmlNodeList

XmlDocument doc = new XmlDocument(); 
doc.Load(filePath); 
XmlNodeList list = doc.SelectNodes("X/Y"); 
var node = list.Cast<XmlNode>().Where(node => node["id"].InnerText == "abc") 
           .Select(x=>x["abv"].InnerText); 

Ma non funziona, nodo ["id"]. InnerText è sempre "". Puoi indicare dov'è un problema?

Grazie mille

+3

Ebbene, il nodo XML ha alcun testo interno. ' Questo è il testo interno'. Ho dimenticato la proprietà esatta, ma probabilmente è qualcosa come 'node.Attributes [" id "]. Valore ==" abc "' e 'Seleziona (x => x.Attributes [" abv "]. Valore)' – Rob

+0

Thx , davvero utile –

risposta

5

Il InnerText per un nodo è il testo che appare tra <node> e </node>. Quindi, per esempio, <Y attributes /> non c'è testo interno.

è necessario utilizzare node => node.Attributes["id"].Value == "abc"

8

A parte il fatto che cosa lo snippet di codice non essere compilato a causa di non unica variabile node (primo al di fuori delle query LINQ aтd secondo in "dove" il metodo lambda), si è anche perso Attributes nella tua query.

Dovrebbe essere qualcosa di simile

var node = list.Cast<XmlNode>() 
       .Where(n => n.Attributes["id"].InnerText == "abc") 
       .Select(x => x.Attributes["abv"].InnerText);