Почему этот запрос XElement не работает на моем XML - PullRequest
2 голосов
/ 10 марта 2010

Мой xml выглядит так:

<nodes>
<node name="somekey">
<item name="subject">blah</item>
<item name="body">body</item>
</node>
</nodes>

И мой код:

XDocument doc = XDocument.Load(HttpContext.Current.Server.MapPath(String.Format("~/files/{0}/text.xml", "en")));

if (doc != null)
{
    XElement element = doc.Elements().Where(e => e.Elements().Any() && e.Attribute("name").Value == "someKey").First();
}

Я получаю сообщение об ошибке:

Sequence contains no elements

Мой запрос неверен?

Я прошел по коду, и он выдает ошибку в строке с XElement ..

Ответы [ 2 ]

3 голосов
/ 10 марта 2010

Вы хотите что-то вроде этого:

var element = doc.Descendants("node").Where(x => x.Attribute("name") != null && x.Attribute("name").Value == "somekey").FirstOrDefault();

Редактировать: Редактировать, чтобы получить первый элемент из результата;

2 голосов
/ 10 марта 2010

Вы также можете использовать:

var element = doc.Elements()
                 .Elements()
                 .Where(e => (e.Elements().Any() 
                              && e.Attribute("name").Value == "somekey"))
                 .First();

Объяснение:

doc.Elements() захватывает корневой элемент, который является nodes. Затем .Elements() выбирает дочерние элементы того, что является только одним, node. Затем .Where() выполняется на этом наборе узлов, что вам и нужно. Лямбда выбирает те элементы, которые имеют дочерние элементы, а также имеют атрибут «name» со значением «somekey».

В вашем исходном коде не было элементов Child-of-Child. Следовательно, исходный набор результатов был пуст.

Вы также можете сделать это с .Descendants(), но мне это кажется немного неаккуратным и свободным.

...