2009-10-28 12 views
8

Tengo una colección de IEnumerables y cada uno tiene valores de atributo diferentes que corresponden a una propiedad diferente en mi objeto comercial. Este es un ejemplo del XML que yo estoy consultando en contra:Buscar XElement por valor de atributo

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

Creo que mi linq2xml lambda está cerca (después de buscar MSDN y SO) pero me parece que no puede modificar lo justo:

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

El valor de obtener cityName del asignado a "System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [System.Xml.Linq.XElement, System.String]" en lugar de Arlington Heights

¿Alguna sugerencia? Gracias

Respuesta

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

que devuelve un IEnumerable<string> (métodos de extensión Linq casi siempre volver colecciones y casos no individuales) que contienen todos los valores de los elementos cuyos name atributo es igual a name. Luego tomamos el primero, o null si está vacío.

Además, ese XML es horrendo y debe filmarse.

+6

¡+1 para ese XML se debe tomar! – CoderDennis

+5

Sugeriría usar '(cadena) Atributo (" nombre ")' sobre 'Atributo (" nombre "). Valor' - es lo mismo, excepto que primero hace una verificación nula. Dado que 'Attribute()' devuelve 'null' cuando ningún atributo con ese nombre sale de un elemento, el primer elemento de ese tipo desencadenaría una' NullReferenceException' en la consulta tal como está escrita actualmente. –

+0

Damnit, sabía que era solo una pequeña cosa que me estaba perdiendo, agregando que FirstOrDefault lo hizo. Gracias. No hay mucho que pueda hacer sobre XML, es una fuente de importación de datos de terceros. –

3

Si tiene el código 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> 

cargado en la XElement/XDocument SimpleDataList, se puede consultar mediante XPath:

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

Pero no estoy seguro de si tiene una XElement a comenzar con un simple IEnumerable ... En cualquier caso ... pensé que mencionaría XPath en caso de que lo ayudara.

+1

No tiene mucho sentido utilizar XPath para consultar 'XDocument', ya que está específicamente diseñado para LINQ. XPath también será un poco más lento (porque es una cadena que debe analizarse primero). –

Cuestiones relacionadas