如何在模型

时间:2016-05-25 10:55:58

标签: c# xml linq

我有一个XML文档:

<Preferences>
    <Section Name="PREF_SECTION_NAME_1">
        <Preference Name="PREF_NOTIFY" Type="radio">
            <Options>
                <Option Name="PREF_OPT_YES" Value="true"/>
                <Option Name="PREF_OPT_NO" Value="false"/>
            </Options>
            <Default>true</Default>
       </Preference>
       <Preference Name="PREF_EXAMPLE" Type="textarea" >
           <Default>lots and lots of lines of text"</Default>
       </Preference> 
   </Section>
</Preferences>

这是我的模特:

[XmlRoot("Preferences")]
public class PreferencesModel
{
    [XmlElement(ElementName = "Section")]
    public List<Section> Section { get; set; }
}

public class Section
{
    [XmlAttribute("Name")]
    public string Name { get; set; }

    [XmlElement("Preference")]
    public List<PreferenceModel> PreferenceModel { get; set; }
}

[XmlType("Preference")]
public class PreferenceModel
{
    [XmlAttribute("Type")]
    public string Type { get; set; }

    [XmlAttribute("Name")]
    public string Name { get; set; }

    [XmlAttribute("Default")]
    public string Default { get; set; }

    [XmlElement("Options")]
    public List<Option> Options { get; set; }
}

[XmlAttribute("Name")]
[XmlType("Option")]
public class Option
{
    public string Name { get; set; }

    [XmlAttribute("Value")]
    public string Value { get; set; }
}

我使用XDocument通过Linq:

访问此XML数据

我的XML模型方法:

public PreferencesModel GetDefaults(XmlDocument userDoc)
{
    XDocument xDocUser = userDoc.ToXDocument();

    return new PreferencesModel()
    {
        Section = xDocUser.Root.Elements("Section").Select(x => new Section()
        {
            Name = x.Attribute("Name").Value,
            PreferenceModel = x.Elements("Preference").Select(
            y => new PreferenceModel()
            {
                Name = y.Attribute("Name").Value,
                Default = (string)y.Element("Default").Value,
                Type = y.Attribute("Type").Value,
                Options = y.Elements("Options").Select(z => new Option()
                {
                    Name = z.Attribute("Name").Value,
                    Value = z.Attribute("Value").Value
                }).ToList(),
            }).ToList(),
        }).ToList()
    };
}

当我跑步时我得到了这个:

enter image description here

2 个答案:

答案 0 :(得分:2)

在您的上下文中,y是元素Preference。然后,您可以选择其所有子Options元素并获取其NameValue属性。

Options没有任何属性,只有子Option元素。

您的Options选择器应为:

y.Descendants("Option").Select(z => new Option
{
    Name = (string)z.Attribute("Name"),
    Value = (string)z.Attribute("Value")
}

请注意,我还使用了XAttributestring的显式转换。如果属性不存在而不是抛出null,则返回NullReferenceException的优势。

但是......为什么不使用XmlSerializer,因为你已经用属性标记了所有内容?

答案 1 :(得分:0)

简单地反序列化XML将为您提供预期的结果:

using (var reader = new StringReader(xml))
{
    var xmlSerializer = new XmlSerializer(typeof(PreferencesModel));
    var data = xmlSerializer.Deserialize(reader);
}