Trouver XElement par valeur D'attribut

j'ai une collection de IEnumerables et chacun a différentes valeurs d'attribut qui correspond à une propriété différente sur mon objet de l'entreprise. Voici un exemple du XML contre lequel je pose une question:

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

je pense que mon linq2xml lambda est proche (après avoir cherché MSDN et ainsi de suite) mais je ne peux pas sembler le modifier juste:

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

la valeur de cityName get est assignée à "Système.Linq.Énumérable+WhereSelectEnumerableIterator`2[Système.XML.Linq.XElement, Système.String] " au lieu de ARLINGTON HEIGHTS

des suggestions? Merci

8
demandé sur CoderDennis 2009-10-28 22:49:25

2 réponses

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

ou

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

qui retourne un IEnumerable<string> (les méthodes D'extension Linq renvoient presque toujours des collections et pas des instances simples) contenant toutes les valeurs des éléments dont name l'attribut est égal à name. Puis nous prenons la première, ou null si elle est vide.

en outre, ce XML est horrible et devrait être tourné.

16
répondu Will 2009-10-28 19:58:13

si vous avez le 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>

chargé dans le SimpleDataList XElement/XDocument, vous pouvez interroger avec XPath:

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

mais je ne suis pas sûr que vous ayez un élément pour commencer ou un simple IEnumerable... Dans tous les cas.. J'ai pensé mentionner XPath au cas où ça vous aiderait.

3
répondu Nestor 2009-10-28 20:09:19