2009-09-01 136 views
3

我遇到了从xml文件中读取值的麻烦。 下面是XML文件:从Linq的xml文件中读取值

<root> 
    <defaultGroups name="Sikker"> 
     <group name="0ASK" /> 
     <group name="0ASKAPP" /> 
     <group name="0ASKFELLES" /> 
     <group name="0SYSAPP" /> 
     <group name="0SYSAPPoffice" /> 
     <group name="10WTS" /> 
    </defaultGroups> 
    <defaultGroups name="Intern"> 
     <group name="11WTS" /> 
     <group name="1ASK" /> 
     <group name="1ASKAPP" /> 
     <group name="1ASKFELLES" /> 
     <group name="Domain Users" /> 
     <group name="Askvoll brukere" /> 
     <group name="1SYSAPP" /> 
     <group name="1SYSAPPAdobeReader" /> 
     <group name="1SYSAPPEXCEL" /> 
     <group name="1SYSAPPIEXPLORER" /> 
     <group name="1SYSAPPOUTLOOK" /> 
     <group name="1SYSAPPPOWERPOINT" /> 
     <group name="1SYSAPPWORD" /> 
    </defaultGroups> 
</root> 

如下所示的功能,我应该只从<defaultGroups name="Sikker">读出值。我确实得到了第一个值:“0ASK”,但不是其他值。有人可以帮助我吗? (我是新来的LINQ)

这是C#功能使用:

public string GetSikkerSoneDefaultGroups(string companyName) 
    { 
     string sikkerSone = ""; 

     XDocument doc = XDocument.Load("xml\\defaults\\" + companyName + ".xml"); 
     var groups = from defaultGroups in doc.Descendants("defaultGroups") 
        where defaultGroups.Attribute("name").Value == "Sikker" 
        select new 
        {        
         g = defaultGroups.Element("group").Attribute("name").Value 
        }; 

     foreach (var group in groups) 
     { 
      sikkerSone += group.g + ";"; 
     } 

     doc = null; 

     return sikkerSone; 

    } 

回答

2

您使用:

g = defaultGroups.Element("group").Attribute("name").Value 

只选择defaultGroups的第一个子元素。我认为我们可以简化这一点,就像你接近它的方式,你需要一个子查询。为什么不直接获得组元素?

var groups = from defaultGroup in doc.Descendants("group") 
      where defaultGroup.Parent.Attribute("name").Value == "Sikker" 
      select defaultGroup.Attribute("name").Value; 


// Make it into a string 
foreach (var group in groups) 
{ 
    sikkerSone += group + ";"; 
} 
+0

非常感谢您womp!这工作正如我想:) 完美! – 2009-09-01 18:11:37

0
string sikkerSone = string.Join(";", 
    (from dg in doc.Descendants("defaultGroups") 
    where dg.Attribute("name") == "Sikker" 
    from g in dg.Elements("group") 
    select (string)g.Attribute("name")) 
    .ToArray());