繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM