0

我需要一些有关 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 循环的情况下如何解决这个问题?

谢谢

4

2 回答 2

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
});
于 2012-04-27T01:50:03.987 回答
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 } );
于 2012-04-27T01:55:39.690 回答