我需要一些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循环的情况下解决这个问题?
谢谢
答案 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 } );