Вопрос

Мой 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 возникла ошибка.

Это было полезно?

Решение

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

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

Редактировать: Отредактировано для получения первого элемента из результата;

Другие советы

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

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() но мне это кажется немного небрежным и небрежным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top