Как получить элементы по имени в 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);