2009-10-28 5 views
8

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

<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 получить присвоенный "System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [System.Xml.Linq.XElement, System.String]" вместо Арлингтон Хайтс

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

ответ

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

+6

+1 для этого XML следует снимать! – CoderDennis

+5

Я бы предложил использовать атрибут '(string) Attribute (" name ")' over 'Attribute (" name "). Value' - это одно и то же, за исключением того, что сначала выполняется нуль-проверка. Поскольку 'Attribute()' возвращает 'null', когда атрибут с таким именем не выходит из элемента, первый такой элемент запускает' NullReferenceException' в запросе, как в настоящее время написано. –

+0

Черт, я знал, что это была одна маленькая вещь, которую мне не хватало, добавив, что FirstOrDefault сделал это. Благодарю. Немного я могу сделать с XML, это источник импорта сторонних данных. – 2009-10-28 20:08:34

3

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

+1

Не имеет смысла использовать XPath для запроса 'XDocument', поскольку он специально разработан для LINQ. XPath также будет немного медленнее (потому что это строка, которую нужно сначала разобрать). –

Смежные вопросы