C# Linq到XML-多级

C# Linq到XML-多级,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我对Linq到xml查询有点问题。请看下面的数据 <area id="16"> <standard value="1"> <temp value="M" /> </standard> <standard value="2"> <temp value="M" /> </standard> <standard value="3">

我对Linq到xml查询有点问题。请看下面的数据

<area id="16">
    <standard value="1">
      <temp value="M" />
    </standard>
    <standard value="2">
      <temp value="M" />
    </standard>
    <standard value="3">
      <temp value="M" />
    </standard>
  </area>

  <area id="17">
    <standard value="1">
      <temp value="M" />
    </standard>
    <standard value="2">
      <temp value="M" />
    </standard>
    <standard value="3">
      <temp value="M" />
    </standard>
  </area>

基本上,当我将区域id和标准值作为变量时,我想从xml中提取临时值

我可以通过以下查询得到面积

    IEnumerable<XElement> area =
        from c in areaRisk.Elements("area")
        where (string)c.Attribute("id") == ddlArea.SelectedValue.ToString()
        select c;
IEnumerable区域=
来自区域风险要素(“区域”)中的c
其中(string)c.Attribute(“id”)==ddlArea.SelectedValue.ToString()
选择c;
但是我不确定如何使用对区域XElement enumerable的类似查询获取临时值,或者是否可以修改上述查询以提取值

任何帮助都将不胜感激

谢谢


Steve

您可以在一个查询中完成所有操作:

// change the assignment with whatever you want
int areaId = 17;
int standardValue = 3;
基于语法的查询解决方案:

string tempValue =
    (from c in areaRisk.Elements("area")
     where (int)c.Attribute("id") == areaId 
     from s in c.Elements("standard")
     where (int)s.Attribute("value") == standardValue 
     select (string)c.Element("temp").Attribute("value")).FirstOrDefault();
或基于方法的查询:

string tempValue = areaRist.Elements("area")
                           .FirstOrDefault(a => (int)a.Attribute("id") == areaId)
                           .Elements("standard")
                           .FirstOrDefault(s => (int)s.Attribute("value") == standardValue)
                           .Element("temp")
                           .Attribute("value")
                           .Value;

假设您的区域ID是唯一的,请将查询更改为仅返回匹配的区域,如下所示:

XElement area =
    (from c in areaRisk.Elements("area")
    where (string)c.Attribute("id") == ddlArea.SelectedValue.ToString()
    select c).FirstOrDefault();
然后,您可以对其调用另一个
Elements()

var result = area.Elements("standard").Select(s => new {
    ID = s.Attribute("id").Value,
    Temp = s.Element("temp").Attribute("value") 
});

这将为您提供所有的临时ID和值。

谢谢,基于语法的解决方案带来了一个空引用错误,但更改了c.Element(“temp”).Attribute(“value”).FirstOrDefault();到s.Element(“temp”)修复了它。