我正在尝试查询web.Config包含WCF条目的文件.
在<service>节点中有一个name attribute我想要匹配的节点.到目前为止,我的代码在进行匹配时已经起作用,但我的问题是它只返回1个<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>
Run Code Online (Sandbox Code Playgroud)
每当我得到一个匹配项时,我希望它显示<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");
Run Code Online (Sandbox Code Playgroud)
目前,当匹配时,仅显示1个端点.
我想你想要这个:
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");
Run Code Online (Sandbox Code Playgroud)
请注意,我正在选择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();
Run Code Online (Sandbox Code Playgroud)
因此,正如编译器告诉你的那样,LINQ查询的结果是IEnumerable的IEnumerable,所以我把First()结果给了我一个IEnumerable<XElement>,然后我们调用Descendants()它,它给你一个IEnumerable的端点XElement.
另请注意,我使用了Value属性XAttribute,你不能简单地将其XAttribute转换为字符串,你必须使用该Value属性.在我最初的复制/粘贴答案中,我没有注意到这一点.
**更新2**
上面的查询可能会更容易理解如下:
doc.Root.Descendants("service")
.Where(x => x.Attribute("name").Value == serviceString)
.First()
.Descendants();
Run Code Online (Sandbox Code Playgroud)
**更新3**
在属性匹配上也有可能有NRE,所以这可能是一个更好的 verison.=)
doc.Root.Descendants("service")
.Where(x => x.Attribute("name") != null && x.Attribute("name").Value == serviceString)
.First()
.Descendants();
Run Code Online (Sandbox Code Playgroud)