将平面xml反序列化为实体

时间:2010-02-15 22:41:50

标签: c# xml serialization

拥有以下XML模型

<A></A>
<B></B>
<C></C>
<D></D>

还有三个班级

class Foo1{
  public string A;
  public string B;
}
class Foo2{
  public string C;
  public string D;
}

class FooUnited{
  public Foo1 foo1;
  public Foo2 foo2;
}

问题所在。我想将xml反序列化为FooUnited类型的对象。蛮力的想法是从xml手动选择值并初始化FooUnited对象,但也许有一个更优雅的解决方案呢?

3 个答案:

答案 0 :(得分:1)

假设您有一个根元素,您可以使用DTO来包装差异:

public class MyDto {
    public string A {get;set;}
    public string B {get;set;}
    public string C {get;set;}
    public string D {get;set;}

    public FooUnited GetObject() {
        return new FooUnited {
            foo1 = new Foo1 { A = this.A, B = this.B },
            foo2 = new Foo2 { C = this.C, D = this.D },
        };
    }
}

答案 1 :(得分:0)

不,据我所知,你不能自动做到这一点。要使用XmlSerialization(内置于.NET),对象模型中的层次结构必须与文档中的层次结构匹配。

使用您的类结构,它将是这样的:

<FooUnited>
    <Foo1>
        <A></A> 
        <B></B> 
    </Foo1>
    <Foo2>
        <C></C> 
        <D></D> 
    </Foo2>
</FooUnited>

你需要一个纪念品或DTO,正如MArc描述的那样。

答案 2 :(得分:0)

我很想创建一组不可变类,并使用XPath来解析XML并填充这些类。

如果你同时控制序列化和反序列化,你可以使用像XStream这样的东西。