Найти XElement по значению атрибута - PullRequest
8 голосов
/ 28 октября 2009

У меня есть коллекция 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 и SO), но я не могу настроить ее правильно:

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

Значение cityName get присваивается «System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [System.Xml.Linq.XElement, System.String]» вместо ARLINGTON HEIGHTS

Есть предложения? Спасибо

Ответы [ 2 ]

16 голосов
/ 28 октября 2009
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 ужасен и должен быть застрелен.

3 голосов
/ 28 октября 2009

Если у вас есть 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, если он вам поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...