Как получить элементы по имени в XML с помощью LINQ - PullRequest
13 голосов
/ 09 ноября 2010

Я выбрал название здесь, так как моя проблема в том, что мне нужно получить узлы Item, упомянутые в примере. У меня есть следующий 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>

Я хочу иметь возможность извлечь идентификатор из тега Item XML в Items, однако есть тег Items с записями Item в данных. Я совсем не хочу эти узлы - я хочу 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 ]

23 голосов
/ 09 ноября 2010

Предполагая, что element является вашим <a:entry> элементом:

var ids = element.Element("items")
                 .Elements("item")
                 .Select(item => item.Element("id").Value);

Методы Element и Elements возвращают только прямых потомков, а не всех потомков, поэтому он не возвращает <items> элемент, который находится под <data>

9 голосов
/ 09 ноября 2010

У меня была пустая декларация пространства имен в моем XML, которую я не заметил, как только добавил это в мой код, он работал - забыл, что LINQ очень ориентирован на NameSpace!

XNamespace ns = "http://example.org/namespace";
var ids = element.Element(ns + "items") 
                 .Elements("item") 
                 .Select(item => item.Element("id").Value); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...