使用LINQ to XML初始化对象

本文关键字:初始化 对象 XML to LINQ 使用 | 更新日期: 2023-09-27 18:20:57

我有一个类,它包含一些数据成员(int、string、bool、Point)。这些数据成员具有公共属性{get;set;}。

在我的代码中,我使用默认构造函数创建了这个类的一个实例。因此,我的Object的数据成员的值分别为0string.Emptyfalse{0,0}

如何初始化字段数据的这些值从XML文件,使用LINQ to XML而不创建对象的新实例。

我只想读入XML,并设置Object的值。

使用LINQ to XML初始化对象

将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();