【问题标题】:Linq to XML - multilevelLinq to XML - 多级
【发布时间】:2013-08-12 18:37:56
【问题描述】:

我在使用 Linq to 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;

但我不确定如何使用对区域 XElement 可枚举的类似查询来获取临时值,或者是否可以修改上述查询以提取值。

任何帮助将不胜感激!

谢谢,

史蒂夫

【问题讨论】:

    标签: c# xml linq linq-to-xml


    【解决方案1】:

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

    // 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;
    

    【讨论】:

    • 谢谢,基于语法的解决方案会出现空引用错误,但会更改 c.Element("temp").Attribute("value")).FirstOrDefault();到 s.Element("temp") 修复它。
    【解决方案2】:

    假设您的区域 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 和值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多