如何将嵌套的XML加载到LINQ中

时间:2016-05-18 08:26:55

标签: c# xml linq

我有一个xml文档:

<preferences>
  <section name="PREF_SECTION_NAME_1">
    <preference name="PREF_EXAMPLE_1" type="radio">
      <default value="true"></default>
    </preference>
    <preference name="PREF_EXAMPLE_2" type="radio">
      <default value="true"></default>
    </preference>
    <preference name="PREF_EXAMPLE_3" type="radio">
       <default value="true"></default>
    </preference>
  </section>
  <section name="PREF_SECTION_NAME_2">
    <preference name="PREF_EXAMPLE_1" type="radio">
      <default value="true"></default>
    </preference>
    <preference name="PREF_EXAMPLE_2" type="radio">
      <default value="true"></default>
    </preference>
    <preference name="PREF_EXAMPLE_3" type="radio">
      <default value="true"></default>
    </preference>
  </section>
</preferences>

我在课堂上代表了这一点:

public class Preference
{
    public string Name { get; set; }
    public bool Default { get; set; }
}

public class Section
{
    public string Name { get; set; }
    public List<Preference> Preference { get; set; }
}

public class Preferences
{
    public List<Section> Section { get; set; }
}

我试图用我的C#方法加载它:

var xDoc = XDocument.Load("XMLFile.xml");

var sections = xDoc.Root
                  .Elements("Preferences")
                  .Select(x => new List<Section>
                  {
                    //what do I put in here?

                  })
                  .ToList();

似乎没有什么明显的东西//我在这里放什么?

我已经看到很多例子以这种方式加载非嵌套类。有没有办法做到这一点或??

感谢

3 个答案:

答案 0 :(得分:2)

这就是你想要的:

console.log(total());

这给出了:

preferences

答案 1 :(得分:1)

您可能想要这样做。

var sections = xDoc.Root
                  .Descendants("section")
                  .Select(x => new Section
                  {
                     Name = x.Attribute("name").Value,
                     Preference = x.Elements("preference")
                                    .Select(y=> new Preference 
                                            {
                                                Name = (string)y.Attribute("name"),
                                                Default = (bool)y.Element("default").Attribute("value")
                                            })
                                     .ToList()
                  })
                 .ToList()

现在可以使用下面创建您的(根)Preferences实例。

var preferences = new Preferences {Section = sections };

选中此Demo

答案 2 :(得分:1)

        var xDoc = XDocument.Load("sample1.xml");
        var sections = xDoc.Root.Descendants("section")
                          .Select(x => new Section
                          {
                              Name = x.Attribute("name").Value,
                              Preference = GetPreference(x)
                          }).ToList();

  private static List<Preference> GetPreference(XElement x)
    {
        return x.Descendants("preference").Select(y => new Preference
                                            {
                                                Name = y.Attribute("name").Value,
                                                Default = ConvertToBool(y.Descendants("default").FirstOrDefault().Attribute("value").Value)
                                            }).ToList();
    }

    private static bool ConvertToBool(string trueOrFalse)
    {
        return trueOrFalse == "true" ? true : false;
    }

这应该有所帮助。