使用LINQ to XML初始化Object

时间:2012-01-22 12:50:29

标签: c# xml linq

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

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

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

我只想阅读XML,并设置我的对象的值。

2 个答案:

答案 0 :(得分:2)

使用Linq to 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)
});

答案 1 :(得分:1)

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