我在这里选择了标题,因为我的问题是需要获取示例中提到的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);
}
答案 0 :(得分:23)
假设element
是您的<a:entry>
元素:
var ids = element.Element("items")
.Elements("item")
.Select(item => item.Element("id").Value);
Element
和Elements
方法仅返回直接子项,而不是所有后代,因此它不会返回<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);