如何使用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);
Element
和Elements
方法只返回直接子Element
,而不是所有后代,因此它不返回下的
元素
我的XML中有一个空白的命名空间声明我没有注意到,一旦我将它添加到我的代码中它就行了 – 忘了LINQ非常面向NameSpace!
XNamespace ns = "http://example.org/namespace"; var ids = element.Element(ns + "items") .Elements("item") .Select(item => item.Element("id").Value);