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

为具有子属性的子级查询Xelements

  •  1
  • Omnia9  · 技术社区  · 15 年前

    以下是XML大纲:

    <Root> 
      <Thing att="11">    
        <Child lang="e">  
           <record></record>
           <record></record>
           <record></record>  
       </Child >
       <Child lang="f">  
           <record></record>  
           <record></record>                
           <record></record>
       </Child > 
     </Thing> 
    </Root>
    

    我有以下几点:

    TextReader reader = new StreamReader(Assembly.GetExecutingAssembly()
                     .GetManifestResourceStream(FileName));
    
       var data = XElement.Load(reader);
    foreach (XElement single in Data.Elements())
     {
          // english records
          var EnglishSet = (from e in single.Elements("Child")
             where e.Attribute("lang").Equals("e")
            select e.Value).FirstOrDefault();
    }
    

    但我什么也没回来。我希望能够为每个“事物”选择属性“lang”等于值的“子对象”。

    我也试过这个,但没用。

    var FrenchSet = single.Elements("Child")
    .Where(y => y.Attribute("lang").Equals("f"))
    .Select(x => x.Value).FirstOrDefault();
    
    3 回复  |  直到 15 年前
        1
  •  2
  •   SLaks    15 年前

    你在检查 XAttribute 对象等于字符串 "e" .
    自从一个 X属性 对象从不等于字符串,它不起作用。

    你需要检查一下 X属性 对象的 Value ,像这样:

    where y => y.Attribute("lang").Value == "e"
    
        2
  •  1
  •   Mark Byers    15 年前

    您正在将属性对象与字符串“e”进行比较,而不是将属性对象的值进行比较。您还返回节点的值,而不是节点的值。因为值是空的,所以您只需要得到空字符串。

    试试这个:

    var EnglishSet = (from e in single.Elements("Child")
                      where e.Attribute("lang").Value == "e"
                      select e).FirstOrDefault();
    
        3
  •  1
  •   Stephan    15 年前
    var EnglishSet = (from e in single.Elements("Child")
             where e.Attribute("lang").Value.Equals("e")
            select e).FirstOrDefault();
    

    正如slaks所说,您正在检查属性not it's value是否为“e”。你也不需要 select e.Value 因为“子”节点没有值,所以它们有“记录”子节点。