linq to xml获取所有子节点

时间:2012-01-26 21:14:42

标签: c# linq-to-xml

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

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