我正在尝试查询包含WCF条目的web.Config
文件。
在<service>
节点中,有一个我想要匹配的name attribute
。到目前为止,我的代码在进行匹配时已经起作用,但我的问题是它只返回<endpoint>
个节点中的一个。
例如,我可以使用xml的片段:
<service name="a">
<endpoint>1</endpoint>
<endpoint>2</endpoint>
<endpoint>3</endpoint>
</service>
<service name="b">
<endpoint>1</endpoint>
<endpoint>2</endpoint>
</service>
每当我得到一个匹配项时,我希望它显示该匹配项的所有<endpoint>
个子节点。
这是我到目前为止的代码:
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个端点。
答案 0 :(得分:6)
我想你想要这个:
IEnumerable<XElement> xmlURL =
from el in xmlFile.Root.Descendants("service")
where (string)el.Attribute("name") == serviceString
select el.Descendants("endpoint");
Console.WriteLine("Start: " + serviceString);
foreach (XElement el in xmlURL)
{
Console.WriteLine(el);
}
Console.WriteLine("End: " + serviceString + "\n\n");
请注意,我选择的是el.Descendants()
而不是Element()
,它只会返回第一个匹配项(http://msdn.microsoft.com/en-us/library/system.xml.linq.xcontainer.element.aspx)。
** 更新 **
我认为这就是你想要的,因为你只能用一个特定的匹配来对抗。
IEnumerable<XElement> xmlURL =
(from el in doc.Root.Descendants("service")
where el.Attribute("name").Value == serviceString
select el).First().Descendants();
因此,正如编译器告诉你的那样,LINQ查询的结果是IEnumerable的IEnumerable,所以我把First()
结果给了我一个IEnumerable<XElement>
,然后我们调用{ {1}},它为您提供了端点Descendants()
的IEnumerable。
另请注意,我使用XElement
的{{1}}属性,您不能简单地将Value
强制转换为字符串,您必须使用XAttribute
属性。我在最初的复制/粘贴答案中没有注意到这一点。
** 更新2 **
以上查询可能更容易理解:
XAttribute
** 更新3 **
还有可能在属性匹配上使用NRE,因此这可能是更好的版本。 =)
Value