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

我在这里选择了标题,因为我的问题是需要获取示例中提到的Item节点。 我有以下XML,并且使用LINQ查询它时遇到问题,我之前已经能够解析XML了 – 但是我已经坚持了几个小时并希望有人可以提供帮助。 以下是我的XML数据(示例数据):

 98765 Data Catalogue    123456 Item One   654321 Item Two      123456 Item One   654321 Item Two    Catalogue   

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

我尝试过以下方法:

  IEnumerable 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); } 

假设element是你的元素:

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

ElementElements方法只返回直接子Element ,而不是所有后代,因此它不返回下的元素

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

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