我有一个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()
};
}
当我跑步时我得到了这个:
答案 0 :(得分:2)
在您的上下文中,y
是元素Preference
。然后,您可以选择其所有子Options
元素并获取其Name
和Value
属性。
Options
没有任何属性,只有子Option
元素。
您的Options
选择器应为:
y.Descendants("Option").Select(z => new Option
{
Name = (string)z.Attribute("Name"),
Value = (string)z.Attribute("Value")
}
请注意,我还使用了XAttribute
到string
的显式转换。如果属性不存在而不是抛出null
,则返回NullReferenceException
的优势。
但是......为什么不使用XmlSerializer
,因为你已经用属性标记了所有内容?
答案 1 :(得分:0)
简单地反序列化XML将为您提供预期的结果:
using (var reader = new StringReader(xml))
{
var xmlSerializer = new XmlSerializer(typeof(PreferencesModel));
var data = xmlSerializer.Deserialize(reader);
}