【问题标题】:Initialize Object with LINQ to XML使用 LINQ to XML 初始化对象
【发布时间】:2012-02-16 04:27:06
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

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

    【讨论】:

    • 不完全是我想要的,但非常有帮助,谢谢。
    【解决方案2】:

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

    【讨论】:

    • 如果使用 Linq 做这种风格不好,那我怎么能很好地做到这一点?使用 xml 文件中的信息编辑对象数据而不创建新实例应该是可行的,不是吗?
    • 只是不要在 LINQ 查询中执行此操作。只需使用 LINQ to XML 检索一些数据并将其注入该对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多