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

Rog*_*oid 13 c# xml linq silverlight 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>
Run Code Online (Sandbox Code Playgroud)

我希望能够从Items下的Item XML标签中提取ID,但是在数据下面有一个带有Item条目的Items Tag我根本不想要这些节点 - 如果表达了我想要root/items/id/id作为道路.我已经尝试过LINQ的所有知识,所以如果有人可以提供帮助,请注意事项,尽管这是基于系统的示例数据 - 格式无法更改,因此这不是一个可接受的解决方案.
我似乎无法确定我出错的地方 - 我尝试的每个LINQ表达式都不会返回任何内容,我认为命名空间是一个问题,并且已经尝试集成这个但是我要进入圈子.
解决方案必须在Silverlight和C#中工作

我尝试过以下方法:

    IEnumerable<XElement> nodes = 
element.Elements().Where(e => e.Name.LocalName == "items")
Run Code Online (Sandbox Code Playgroud)

然而,这让我得到了所有"项目",包括"数据"下的那些我不想要那些.


如果我在XML上执行以下操作,我会看到显示的元素名称:

XElement element = XElement.Parse(data);
foreach (XElement node in element.Elements())
{
  MessageBox.Show(node.Name.LocalName);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,我根本看不到项目下的节点名称 - 我已经检查了XElement,它确实有节点,当我输出上面的名称时,"items"会显示信息和id!

  foreach (XElement node in element.Elements("items"))
  {
    MessageBox.Show(node.Name.LocalName);
  }
Run Code Online (Sandbox Code Playgroud)

Tho*_*que 24

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

var ids = element.Element("items")
                 .Elements("item")
                 .Select(item => item.Element("id").Value);
Run Code Online (Sandbox Code Playgroud)

ElementElements方法返回唯一的直接孩子,不是所有的子孙,所以它不会返回<items>它是在元素<data>


Rog*_*oid 9

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

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

  • 我已经根据反馈更正了这个答案的大小写,八年后添加更正后的前夕永远不会太晚 (2认同)