使用LINQ to XML初始化对象
本文关键字:初始化 对象 XML to LINQ 使用 | 更新日期: 2023-09-27 18:20:57
我有一个类,它包含一些数据成员(int、string、bool、Point)。这些数据成员具有公共属性{get;set;}。
在我的代码中,我使用默认构造函数创建了这个类的一个实例。因此,我的Object的数据成员的值分别为0
、string.Empty
、false
和{0,0}
。
如何初始化字段数据的这些值从XML文件,使用LINQ to XML而不创建对象的新实例。
我只想读入XML,并设置Object的值。
将Linq用于XML非常容易。这里有一个人为的例子,如果文档更长,并且您需要验证输入,那么它会变得有点困难,但基本思想是相同的
var root = XDocument.Parse(@"<data>
<num>3</num>
<str>string</str>
<boo>true</boo>
<point x=""3"" y=""5"" />
</data>").Root;
public class MyObject()
{
public class Point
{
int X {get;set;}
int Y {get;set;}
}
public MyObject() {
Point = new Point();
}
public int Num {get;set;}
public string Str {get;set;}
public bool Boo {get;set;}
public Point Point {get; private set;}
}
var myObj = root.Select(new MyObject
{
Num = int.Parse(root.Element("num").Value),
Str = root.Element("str").Value,
Boo = bool.Parse(root.Element("boo").Value),
Point.X = int.Parse(root.Element("point").Attribute("x").Value),
Point.Y = int.Parse(root.Element("point").Attribute("y").Value)
});
LINQ是一种函数式语言,这意味着您不能使用它来更改数据,而这正是您想要做的(更改现有对象)你可能想重新思考一下你在做什么
但是,如果您真的想在LINQ查询中做到这一点,您可以通过调用方法来创建一个有副作用的查询(尽管没有建议)。这里有一个例子:
static MyObj UpdateMyObj(MyObj obj, int a, string b,
bool c, Point d)
{
obj.A = a;
obj.B = b;
obj.C = c;
obj.D = d;
return obj;
}
现在您可以在select
子句中使用此方法:
MyObj obj = new MyObj();
var q = (
from x in xml.GetDescendants("root")
select UpdateMyObj(obj, (int)x.Element("a"), ...))
.ToArray();