代码之家  ›  专栏  ›  技术社区  ›  Thorin Oakenshield

在C中使用Xml-to-LINQ读取Xml文件#

  •  0
  • Thorin Oakenshield  · 技术社区  · 14 年前

    <RootElement> 
     <Children> 
        <Child Name="FirstChild" Start="0" End="2"> 
          <Sibling Name="Test1" /> 
          <Sibling Name="Test2" /> 
          <AdditionalSibling Name="Add_Test_1" /> 
          <AdditionalSibling Name="Add_Test_2" /> 
          <MissingSibling Name="Miss_Test_1" /> 
          <MissingSibling Name="Miss_Test_2" / 
     </Child> 
    
     <Child Name="SecondChild" Start="0" End="2"> 
          <Sibling Name="Test3" /> 
          <Sibling Name="Test4" /> 
     </Child> 
     <Child Name="ThirdChild" Start="0" End="2"> 
          <Sibling Name="Test5" /> 
          <Sibling Name="Test6" /> 
      </Child> 
      <Child Name="FourthChild" Start="0" End="2"> 
          <Sibling Name="Test7" /> 
          <Sibling Name="Test8" /> 
      </Child> 
      <Child Name="FifthChild" Start="0" End="2"> 
          <Sibling Name="Test9" /> 
          <Sibling Name="Test10" /> 
      </Child> 
      <Child Name="SixthChild" Start="0" End="2"> 
          <Sibling Name="Test11" /> 
          <Sibling Name="Test12" /> 
      </Child> 
    
      <MatchedChilds> 
         <Child Name="FirstChild" /> 
         <Child Name="SecondChild" /> 
         <Child Name="ThirdChild" /> 
         <Child Name="FourthChild" /> 
         <Child Name="FifthChild" /> 
         <Child Name="SixthChild" />  
      </MatchedChilds> 
     </Children> 
    </RootElement> 
    

    我需要读取“RootElement”下的元素“Child”的属性值

    现在我使用LINQ查询

              List<string> lst = (from element in XDocument.Load(Application.StartupPath + "\\Sample.xml")
                                                           .Descendants("Child")
                                                            group element by element.Attribute("Name").Value into KeyGroup select KeyGroup.Key )
                                                           .ToList();
    

    请给我一个更好的解决方案来使用XML到LINQ

    提前谢谢

    2 回复  |  直到 14 年前
        1
  •  3
  •   Jon Skeet    14 年前

    XDocument doc = XDocument.Load(Application.StartupPath + "\\Sample.xml");
    List<string> lst = doc.Root.Elements("Child")
                          .Select(x => (string) x.Attribute("Name"))
                          .ToList();
    

    注意使用 Elements() 而不是 Descendants() . 这将获得所有名称属性。我不清楚为什么要在原始示例代码中分组,但希望这能让您继续。

        2
  •  0
  •   David Fox    14 年前

    你呢 分组依据

    var query = from element in XDocument.Load(Application.StartupPath + "\\Sample.xml")
        .Descendants("Child")
        group element by element.Attribute("Name").Value into KeyGroup 
        select new { Grouping = KeyGroup.Key, Children = KeyGroup };
    

    以及迭代

    foreach(var namekey in query)
    {
        Console.WriteLine(namekey.Grouping);
        foreach(var child in namekey.Children)
        {
            Console.WriteLine(child.whatever);
        }
    }