使用LINQ to XML将xml解析为类对象

我有

       ...  

和class级

 public class ChemieComponent { public string Name { get; set; } public string Id { get; set; } public double MolarMass { get; set; } } 

我可以使用LINQ查询将此组件解析为对象吗? 怎么样? 我最终应该有一个IEnumerable,对吗?

编辑

       more points...  

您可以使用以下内容:

 XDocument doc = XDocument.Parse(xml); IEnumerable result = from c in doc.Descendants("Component") select new ChemieComponent() { Name = (string)c.Attribute("name"), Id = (string)c.Attribute("id"), MolarMass = (double)c.Attribute("molarmass") }; 

编辑

使用Linq到Xml访问嵌套元素也是可能的:

 public class Point { public string Name { get; set; } public int Pressure { get; set; } public IEnumerable Fractions { get; set; } } public class Fraction { public string Id { get; set; } public double Value { get; set; } } static void Main() { string xml = @"       "; XDocument doc = XDocument.Parse(xml); IEnumerable result = from c in doc.Descendants("Point") select new Point() { Name = (string)c.Attribute("name"), Pressure = (int)c.Attribute("pressure"), Fractions = from f in c.Descendants("Fraction") select new Fraction() { Id = (string)f.Attribute("id"), Value = (double)f.Attribute("value"), } }; } 

我意识到这是一篇很老的post,但我最近一直在阅读XML文章。 我并不热衷于Linq to XML – 它不是非常易读,依赖于“魔术字符串”,并且如果XML模式发生变化则需要更改代码。

对于任何感兴趣的人,我使用XmlSerializer类将XML反序列化为对象。 将反序列化代码放入一个通用的帮助器方法中,然后将一行代码反序列化为一个对象图: –

 using System.IO; using System.Xml.Serialization; class Program { static void Main(string[] args) { var xml = @"          "; var model = DeserializeObject(xml); } private static T DeserializeObject(string xml) { var serializer = new XmlSerializer(typeof(T)); using (var tr = new StringReader(xml)) { return (T)serializer.Deserialize(tr); } } } public class Model { [XmlArrayItem("Point")] public Point[] Points { get; set; } } public class Point { [XmlAttribute(AttributeName = "name")] public string Name { get; set; } [XmlAttribute(AttributeName = "pressure")] public int Pressure { get; set; } [XmlArrayItem("Fraction")] public Fraction[] Fractions { get; set; } } public class Fraction { [XmlAttribute(AttributeName = "id")] public string Id { get; set; } [XmlAttribute(AttributeName = "value")] public double Value { get; set; } } 

几点需要注意: –

这个解决方案显然依赖于使用XML属性来修饰域模型,这些属性可能是您可能接受的,也可能是不可接受的。 该解决方案还依赖于XML中存在的外部元素,如果根元素是一个数组(在此示例中为 ,则该解决方案将无法工作。

无法指定IEnumerable<> (OP提到的); 你可以使用数组或List<>