![](/img/trans.png)
[英]Parse XML data with Multiple List & Class objects using LINQ-To-XML in C#
[英]Parse xml using LINQ to XML to class objects
我有
<Model>
<Components>
<Component name="a" id="aaa" molarmass="60.05"/>
<Component name="b" id="bbb" molarmass="18.02"/>
<Component name="c" id="ccc" molarmass="32.04"/>
<Component name="d" id="ddd" molarmass="46.03"/>
</Components>
...
</Model>
和班級
public class ChemieComponent
{
public string Name { get; set; }
public string Id { get; set; }
public double MolarMass { get; set; }
}
我可以使用LINQ查詢將此組件解析為對象嗎? 怎么樣? 我最終應該有一個IEnumerable,對嗎?
編輯
<Points>
<Point name="P1" pressure="1">
<Fractions>
<Fraction id="aaa" value="0.15272159"/>
<Fraction id="bbb" value="0.15272159"/>
</Fractions>
more points...
</Points>
您可以使用以下內容:
XDocument doc = XDocument.Parse(xml);
IEnumerable<ChemieComponent> 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<Fraction> Fractions { get; set; }
}
public class Fraction
{
public string Id { get; set; }
public double Value { get; set; }
}
static void Main()
{
string xml = @"<Points>
<Point name='P1' pressure='1'>
<Fractions>
<Fraction id='aaa' value='0.15272159'/>
<Fraction id='bbb' value='0.15272159'/>
</Fractions>
</Point>
</Points>";
XDocument doc = XDocument.Parse(xml);
IEnumerable<Point> 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"),
}
};
}
我意識到這是一篇舊帖子,但我最近一直在將XML讀入對象中。 我並不熱衷於Linq to XML - 它不是非常易讀,依賴於“魔術字符串”,並且如果XML模式發生變化則需要更改代碼。
對於任何感興趣的人,我使用XmlSerializer
類將XML反序列化為對象。 將反序列化代碼放入一個通用的幫助器方法中,然后將一行代碼反序列化為一個對象圖:
using System.IO;
using System.Xml.Serialization;
class Program
{
static void Main(string[] args)
{
var xml = @"<?xml version='1.0' encoding='utf-8' ?>
<Model>
<Points>
<Point name='P1' pressure='1'>
<Fractions>
<Fraction id='aaa' value='0.15272159'/>
<Fraction id='bbb' value='0.15272159'/>
</Fractions>
</Point>
</Points>
</Model>";
var model = DeserializeObject<Model>(xml);
}
private static T DeserializeObject<T>(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中存在的外部元素,如果根元素是一個數組(在此示例中為<Points>
,則該解決方案將無法工作。
指定IEnumerable<>
(OP提到的)是不可能的; 你可以使用數組或List<>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.