Десериализовать плоский XML для сущностей - PullRequest
2 голосов
/ 16 февраля 2010

иметь следующую модель 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 ]

1 голос
/ 16 февраля 2010

Предполагая, что у вас есть корневой элемент, вы можете использовать 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 },
        };
    }
}
0 голосов
/ 16 февраля 2010

Я бы соблазнился создать набор неизменных классов и использовать XPath для анализа XML и заполнения этих классов.

В качестве альтернативы вы можете использовать что-то вроде XStream, если вы управляете сериализацией и десериализацией.

0 голосов
/ 16 февраля 2010

Нет, насколько я знаю, вы не можете сделать это автоматически. Чтобы использовать XmlSerialization (встроенный в .NET), иерархия в объектной модели должна соответствовать иерархии в документе.

С вашей структурой классов это будет выглядеть так:

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

Вам понадобится память или DTO, как описал MArc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...