如何使用LINQ在XML中按名称获取元素

时间:2010-11-09 15:55:49

标签: c# xml silverlight linq parsing

我在这里选择了标题,因为我的问题是需要获取示例中提到的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>

我希望能够从Items下的Item XML标签中提取ID,但是在数据下面有一个Items Tag条目条目我根本不想要这些节点 - 我想要root / items / id / id if这被表达为道路。我已经尝试过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,它确实有节点,当我输出上面的名称时,“items”会显示信息和id!

  foreach (XElement node in element.Elements("items"))
  {
    MessageBox.Show(node.Name.LocalName);
  }

2 个答案:

答案 0 :(得分:23)

假设element是您的<a:entry>元素:

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

ElementElements方法仅返回直接子项,而不是所有后代,因此它不会返回<items>

下的<data>元素

答案 1 :(得分:9)

我的XML中有一个空白的命名空间声明我没有注意到,一旦我将它添加到我的代码中就行了 - 忘了LINQ是非常面向NameSpace的!

XNamespace ns = "http://example.org/namespace";
var ids = element.Element(ns + "items") 
                 .Elements("item") 
                 .Select(item => item.Element("id").Value);