linq to xml获取所有子节点
我正在尝试查询包含 WCF 条目的 web.Config
文件。
在
节点中,有一个我试图匹配的 name 属性
。到目前为止,我的代码在进行匹配时已经有效,但我的问题是它只返回 1 个
节点。
例如,我可以有这样的 xml 片段:
<service name="a">
<endpoint>1</endpoint>
<endpoint>2</endpoint>
<endpoint>3</endpoint>
</service>
<service name="b">
<endpoint>1</endpoint>
<endpoint>2</endpoint>
</service>
每次获得匹配项时,我希望它显示该匹配项的所有
子节点。
这是我到目前为止的代码:
IEnumerable<XElement> xmlURL =
from el in xmlFile.Root.Descendants("service")
where (string)el.Attribute("name") == serviceString
select el.Element("endpoint");
Console.WriteLine("Start: " + serviceString);
foreach (XElement el in xmlURL)
{
Console.WriteLine(el);
}
Console.WriteLine("End: " + serviceString + "\n\n");
当前,当它匹配时,仅显示 1 个端点。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我想你想要这个:
注意我选择的是
el.Descendants()
而不是Element()
,它只会返回第一个匹配项 (http://msdn.microsoft.com/en-us/library/system.xml.linq.xcontainer.element.aspx)。** 更新 **
我认为这就是您想要的,因为您只关心一个特定匹配。
因此,正如编译器告诉您的那样,LINQ 查询的结果是 IEnumerable 的 IEnumerable,因此我采用,然后我们对其调用
First()
结果,现在它给出了一个IEnumerable
IEnumerableDescendants()
,这会为您提供端点XElement
的 IEnumerable。另请注意,这里我使用了
XAttribute
的Value
属性,您不能简单地将XAttribute
转换为字符串,您必须使用Value
属性。我在最初的复制/粘贴答案中没有注意到这一点。** UPDATE 2 **
上面的查询可能更容易理解,如下所示:
** UPDATE 3 **
也有可能出现 NRE属性匹配,所以这可能是一个更好版本。 =)
I think you want this:
Notice I'm selecting
el.Descendants()
rather thanElement()
which will only ever return the first match (http://msdn.microsoft.com/en-us/library/system.xml.linq.xcontainer.element.aspx).** UPDATE **
I think this is what you want, because you're only conerned with one specific match.
So the result of the LINQ query is, as the compiler tells you, an IEnumerable of IEnumerables, so I take the
First()
result of which gives me now anIEnumerable<XElement>
, and then we callDescendants()
on that, which gives you an IEnumerable of the endpointXElement
's.Also note here that I used the
Value
property of theXAttribute
, you can't simply cast theXAttribute
to a string, you have to use thatValue
property. I didn't catch that in my initial copy/paste answer.** UPDATE 2 **
The above query can is probably a little easier to understand like this:
** UPDATE 3 **
There is also the potential for a NRE on the attribute matching, so again this is probably an even better verison. =)