[英]LINQ to XML - Get collection of specific values filtered by attribute name
我需要从具有指定属性名称的所有节点中获取所有值的集合。 例如,从下面的XML中,我需要Country为变量之一的所有节点的值集合:
CAN
true
false
US
true
false
MEX
true
false
我已经花了几个小时弄弄了这个,并查看了所有我能找到的MSDN示例,但是我空了。
更新:我将在取得进展的同时不断进行更新。 设法获得对XML的更新,这使得过滤变得更加简单,并且也更新了我的查询。 现在的问题是,我只得到第一个节点,而不是具有Name =“ Country”的所有节点的集合
最后更新:问题已解决。 请参阅下面的答案。 很高兴看到任何建议的改进。
这是我可以使用的XML:
<?xml version="1.0" encoding="utf-8"?>
<FoobarData ReportId="0cd8eacf-b577-4974-ae15-1496c5ec06b8">
<FoobarInfo>
<PreparedBy>Bob Boozer</PreparedBy>
<ReviewedBy>Connie Careful</ReviewedBy>
</FoobarInfo>
<FoobarFoos>
<Foo>
<FooVariables>
<FooVariable VariableName="Country">
<VariableValue>CAN</VariableValue>
<VariableIsRed>true</VariableIsRed>
<VariableIsHappy>false</VariableIsHappy>
</FooVariable>
<FooVariable VariableName="Company">
<VariableValue>Company A</VariableValue>
<VariableIsRed>true</VariableIsRed>
<VariableIsHappy>false</VariableIsHappy>
</FooVariable>
<FooVariable VariableName="DaysWithoutInjury">
<VariableValue>11203</VariableValue>
<VariableIsRed>false</VariableIsRed>
<VariableIsHappy>false</VariableIsHappy>
</FooVariable>
<FooVariable VariableName="DaysSinceBigMeeting">
<VariableValue>857</VariableValue>
<VariableIsRed>false</VariableIsRed>
<VariableIsHappy>true</VariableIsHappy>
</FooVariable>
</FooVariables>
</Foo>
<Foo>
<FooVariables>
<FooVariable VariableName="Country">
<VariableValue>US</VariableValue>
<VariableIsRed>true</VariableIsRed>
<VariableIsHappy>false</VariableIsHappy>
</FooVariable>
<FooVariable VariableName="Company">
<VariableValue>Company B</VariableValue>
<VariableIsRed>true</VariableIsRed>
<VariableIsHappy>false</VariableIsHappy>
</FooVariable>
<FooVariable VariableName="DaysWithoutInjury">
<VariableValue>976</VariableValue>
<VariableIsRed>false</VariableIsRed>
<VariableIsHappy>false</VariableIsHappy>
</FooVariable>
<FooVariable VariableName="DaysSinceBigMeeting">
<VariableValue>780</VariableValue>
<VariableIsRed>false</VariableIsRed>
<VariableIsHappy>true</VariableIsHappy>
</FooVariable>
</FooVariables>
</Foo>
<Foo>
<FooVariables>
<FooVariable VariableName="Country">
<VariableValue>MEX</VariableValue>
<VariableIsRed>true</VariableIsRed>
<VariableIsHappy>false</VariableIsHappy>
</FooVariable>
<FooVariable VariableName="Company">
<VariableValue>Company C</VariableValue>
<VariableIsRed>true</VariableIsRed>
<VariableIsHappy>false</VariableIsHappy>
</FooVariable>
<FooVariable VariableName="DaysWithoutInjury">
<VariableValue>1455</VariableValue>
<VariableIsRed>false</VariableIsRed>
<VariableIsHappy>false</VariableIsHappy>
</FooVariable>
<FooVariable VariableName="DaysSinceBigMeeting">
<VariableValue>580</VariableValue>
<VariableIsRed>false</VariableIsRed>
<VariableIsHappy>true</VariableIsHappy>
</FooVariable>
</FooVariables>
</Foo>
</FoobarFoos>
</FoobarData>
这有效:
var fileData = XElement.Load(srcFile1);
var xElement1 = fileData.Element("FoobarFoos");
if (xElement1 != null)
{
var element1 = xElement1.Element("Foo");
if (element1 != null)
{
var xElement =
element1.Element("FooVariables");
if (xElement != null)
{
var variableCollection =
from element in fileData.Descendants("FooVariable")
where (string) element.Attribute("VariableName").Value == "Country"
select element;
}
}
}
产生:
<FooVariable VariableName="Country">
<VariableValue>CAN</VariableValue>
<VariableIsRed>true</VariableIsRed>
<VariableIsHappy>false</VariableIsHappy>
</FooVariable>
<FooVariable VariableName="Country">
<VariableValue>US</VariableValue>
<VariableIsRed>true</VariableIsRed>
<VariableIsHappy>false</VariableIsHappy>
</FooVariable>
<FooVariable VariableName="Country">
<VariableValue>MEX</VariableValue>
<VariableIsRed>true</VariableIsRed>
<VariableIsHappy>false</VariableIsHappy>
</FooVariable>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.