Найти XElement по значению атрибута

у меня есть коллекция IEnumerables, и каждый из них имеет разные значения атрибутов, которые соответствуют другому свойству моего бизнес-объекта. Вот пример XML, к которому я обращаюсь:

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

Я думаю, что моя лямбда linq2xml близка (после поиска MSDN и т. д.), Но я не могу настроить ее правильно:

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

значение cityName get присваивается "Система.В LINQ.Перечисляемый+WhereSelectEnumerableIterator ' 2[Система.XML.В LINQ.Система Элемент XElement.String] " вместо Арлингтон-Хайтс

какие предложения? Спасибо

2 ответов


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

или

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

который возвращает IEnumerable<string> (методы расширения Linq почти всегда возвращают коллекции, а не отдельные экземпляры), содержащие все значения элементов,name атрибут равен name. Тогда мы возьмем первый, или null если он пуст.

кроме того, этот XML ужасен и должен быть застрелен.


Если у вас есть 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>

загруженный в XElement / XDocument SimpleDataList, вы можете запросить с XPath:

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

но я не уверен, есть ли у вас XElement для начала или простой IEnumerable... В любом случае.. я подумал, что упомяну XPath, если это поможет вам.