linq查询元素w / o foreach

时间:2012-04-27 01:40:54

标签: c# linq linq-to-xml

我需要一些LINQ和XML的帮助。我读过很多文章,但似乎无法找到我正在寻找的东西,因为大多数人都在循环结果以获得价值。我有以下XML,我需要首先根据部分名称访问特定元素,然后再访问控件ID

<formData>
    <section name="SectionA">
        <control id="Textbox1" type="TextBox">
            <value>Value1</value>
        </control>
        <control id="Textbox2" type="TextBox">
            <value>Value2</value>
        </control>
        <control id="Textbox3" type="TextBox">
            <value>Value2</value>
        </control>
    </section>
    <section name="SectionB" />
    <section name="SectionC" />
    <section name="SectionD" />
    <section name="SectionE" />
</formData>

我正在使用以下代码来获取我需要的元素。

IEnumerable<XElement> fields = xDocument.Element("formData").Elements("section")
        .Where(m => m.Attribute("name").Value == "SectionA")
        .Single()
        .Elements("control")
        .Where(f => f.Attribute("id").Value == "Control1");

这导致以下元素:

<control id="Textbox1" type="TextBox">
    <value>Value1</value>
</control>

然而,就我而言......我需要三个独立的值,ID,TYPE和Value。如何在不使用foreach或嵌套的foreach循环的情况下解决这个问题?

谢谢

2 个答案:

答案 0 :(得分:1)

如果你可以使用匿名类型,你可以这样做:

var fields = xDocument.Element("formData").Elements("section")
    .Where(m => m.Attribute("name").Value == "SectionA")
    .Single()
    .Elements("control")
    .Where(f => f.Attribute("id").Value == "Control1").Select( f => new
{
     Id = f.Attribute("id"),
     Type = f.Attribute("type"),
     Value = f.Element("value").Value
});

答案 1 :(得分:0)

试试这个:

xdoc.Descendants("section")
    .Where(m => m.Attribute("name").Value == "SectionA")
    .Single()
    .Descendants("control")
    .Where(f => f.Attribute("id").Value == "Textbox1")
    .Select(f => new 
                   { Id = f.Attribute("id").Value, 
                     Type = f.Attribute("type").Value, 
                     Value = f.Element("value").Value } );

但是我更倾向于在上半场使用XPath:

xdoc.XPathSelectElements(@"//section[@name=""SectionA""]/control[@id=""Textbox1""]")
    .Select(f => new 
                   { Id = f.Attribute("id").Value, 
                     Type = f.Attribute("type").Value, 
                     Value = f.Element("value").Value } );