代码之家  ›  专栏  ›  技术社区  ›  Cyberherbalist

如何构造一个更复杂的单linq-to-xml查询?

  •  0
  • Cyberherbalist  · 技术社区  · 16 年前

    我是一个LINQ新手,所以下面的问题一旦得到回答,可能会变得非常简单和明显,但我必须承认,这个问题让我很恼火。

    给定此XML:

    <measuresystems>
      <measuresystem name="SI" attitude="proud">
        <dimension name="mass" dim="M" degree="1">
          <unit name="kilogram" symbol="kg">
            <factor name="hundredweight" foreignsystem="US" value="45.359237" />
            <factor name="hundredweight" foreignsystem="Imperial" value="50.80234544" />
          </unit>
        </dimension>
      </measuresystem>
    </measuresystems>
    

    我可以使用下面的linq-to-xml查询千克和百分之八之间的转换因子值,但是确实有一种方法可以将四个连续的查询浓缩为一个复杂的查询吗?

    XElement mss = XElement.Load(fileName);
    
    IEnumerable<XElement> ms =
        from el in mss.Elements("measuresystem")
        where (string)el.Attribute("name") == "SI"
        select el;
    
    IEnumerable<XElement> dim =
        from e2 in ms.Elements("dimension")
        where (string)e2.Attribute("name") == "mass"
        select e2;
    
    IEnumerable<XElement> unit =
        from e3 in dim.Elements("unit")
        where (string)e3.Attribute("name") == "kilogram"
        select e3;
    
    IEnumerable<XElement> factor =
        from e4 in unit.Elements("factor")
        where (string)e4.Attribute("name") == "pound" 
            && (string)e4.Attribute("foreignsystem") == "US"
        select e4;
    
    foreach (XElement ex in factor)
    {
        Console.WriteLine ((string)ex.Attribute("value"));
    }
    
    1 回复  |  直到 16 年前
        1
  •  2
  •   Steven    16 年前

    这样就可以了,只要把它们加在一起:

    IEnumerable<XElement> ms =
        from el in mss.Elements("measuresystem")
        where (string)el.Attribute("name") == "SI"
        from e2 in el.Elements("dimension")
        where (string)e2.Attribute("name") == "mass"
        from e3 in e2.Elements("unit")
        where (string)e3.Attribute("name") == "kilogram"
        from e4 in e3.Elements("factor")
        where (string)e4.Attribute("name") == "pound" 
            && (string)e4.Attribute("foreignsystem") == "US"    
        select e4;
    
    推荐文章