Почему этот запрос XElement не работает с моим XML
-
18-09-2019 - |
Вопрос
Мой 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()
но мне это кажется немного небрежным и небрежным.