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、および値の 3 つの個別の値が必要です。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 に答える