Как получить элементы по имени в XML с помощью LINQ
Я выбрал название здесь, поскольку моя проблема заключается в том, что мне нужно получить узлы элементов, упомянутые в Примере. У меня есть следующий XML и возникают проблемы с использованием LINQ для запроса, я смог разобрать XML раньше - однако я застрял на этом в течение нескольких часов и надеюсь, что кто-то может помочь. Вот мои XML-данные ниже (пример данных):
<a:entry xmlns:a="http://www.w3.org/2005/Atom">
<a:id>98765</a:id>
<info>Data Catalogue</info>
<data>
<items>
<item>
<id>123456</id>
<value>Item One</value>
</item>
<item>
<id>654321</id>
<value>Item Two</value>
</item>
<items>
</data>
<items>
<item>
<id>123456</id>
<value>Item One</value>
</item>
<item>
<id>654321</id>
<value>Item Two</value>
</item>
<items>
<a:author>
<a:name>Catalogue</a:name>
</a:author>
</a:entry>
Я хочу иметь возможность извлекать идентификатор из XML-тега элемента под элементами, однако есть тег элементов с записями элементов под данными, которые я не хотите эти узлы вообще - я хочу root / items/id / id, если это было выражено как путь. Я пробовал все, что знаю с LINQ, поэтому, если кто - то может помочь, что-то отметить, хотя это образцы данных, он основан на системе-формат не может быть изменен, так что это неприемлемое решение.
Кажется, я не могу определить, где я ошибаюсь - каждое выражение LINQ, которое я пытаюсь, ничего не возвращает, я думаю, что пространство имен является проблемой и попытался интегрировать это, но я собираюсь круги.
Решение должно работать в Silverlight и C#
я попробовал следующее:
IEnumerable<XElement> nodes =
element.Elements().Where(e => e.Name.LocalName == "items")
однако это дает мне все "элементы", включая те, которые находятся в разделе" Данные", я не хочу их.
если я делаю следующее На моем XML, я вижу имена отображаемых элементов:
XElement element = XElement.Parse(data);
foreach (XElement node in element.Elements())
{
MessageBox.Show(node.Name.LocalName);
}
однако, когда я это делаю, я не вижу имен узлов под элементами вообще - я проверил XElement, и у него есть узел, и когда я выводил имена над ним" элементы " отображаются вместе с информацией и идентификатором!
foreach (XElement node in element.Elements("items"))
{
MessageBox.Show(node.Name.LocalName);
}
2 ответов
предполагая, что element
ваш <a:entry>
элемент:
var ids = element.Element("items")
.Elements("item")
.Select(item => item.Element("id").Value);
на Element
и Elements
методы возвращают только прямых детей, а не всех потомков, поэтому он не возвращает <items>
элемент, который находится под <data>
У меня было пустое объявление пространства имен в моем XML, я не заметил, как только я добавил Это в свой код, он работал - забыл, что LINQ очень ориентирован на пространство имен!
XNamespace ns = "http://example.org/namespace";
var ids = element.Element(ns + "items")
.Elements("item")
.Select(item => item.Element("id").Value);