LINQ to XML - 获取按属性名称过滤的特定值的集合

时间:2014-08-16 02:30:44

标签: c# linq-to-xml

我需要从具有指定属性名称的所有节点获取所有值的集合。例如,从下面的XML中,我需要来自所有节点的值的集合,其中Country是变量之一:

CAN
true
false
US
true
false
MEX
true
false

我已经摆弄了几个小时并查看了我能找到的所有MSDN示例,并且我已经空了。

更新: 随着我的进步,我会继续更新。管理以获取XML的更新,这使得过滤变得更加简单并且也更新了我的查询。现在的问题是我只得到第一个节点而不是所有节点的集合,其名称="国家"

最终更新:问题解决了。请参阅下面的答案。很高兴看到任何建议的改进。

这是我使用的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>

1 个答案:

答案 0 :(得分:0)

这有效:

    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>