linq to xml获取所有子节点

web*_*ad3 2 c# linq-to-xml

我正在尝试查询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个端点.

Cod*_*lla 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");
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)