【问题标题】:Reading values from xml file with Linq使用 Linq 从 xml 文件中读取值
【发布时间】:2009-09-01 17:49:56
【问题描述】:

我在从 xml 文件中读取值时遇到问题。 这是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>

使用下面显示的函数,我应该只读取来自&lt;defaultGroups name="Sikker"&gt; 的值。我确实得到了第一个值:“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;

    }

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    您正在使用:

    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 + ";";
    }
    

    【讨论】:

    • 非常感谢womp!这完全符合我的要求 :) 完美!
    【解决方案2】:
    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());
    

    【讨论】:

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