【问题标题】:LINQ to XML - Get collection of specific values filtered by attribute nameLINQ to XML - 获取按属性名称过滤的特定值的集合
【发布时间】:2014-08-17 04:00:10
【问题描述】:

我需要从具有指定属性名称的所有节点中获取所有值的集合。例如,从下面的 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>

【问题讨论】:

    标签: c# linq-to-xml


    【解决方案1】:

    这行得通:

        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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 2016-06-10
      • 1970-01-01
      • 2013-02-22
      相关资源
      最近更新 更多