使用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<>
。