Внешний Xml в C # Object, какой самый простой способ? - PullRequest
0 голосов
/ 24 августа 2011

У нас есть XML, сгенерированный из внешней программы, которую нужно прочитать в наше приложение C #.

Я знаю, что мы могли бы использовать классы C # с тегом [Serializable] для загрузки объектов, но проблема в том, что у нас уже есть объект, который на самом деле более разделен на ОО, чем Xml. Мы не хотим иметь 2 набора объектов.

Хотя я могу открыть файл с помощью LinqToXml и заполнить наши объекты. Можно ли так делать или лучше всего использовать тег [Serializable] с XmlElementAttribute и другие теги в нашей модели OO? (Если последнее является хорошим решением, как я могу поместить атрибут в объект внутри моего объекта или работать с наследованием?).

Редактировать: Пример

Допустим, у меня есть:

public class Movie {
    public string Name;
    public Actor LeadActor;
}

public class Actor {
    public string Name;
    public DateTime DOB;
}

И я хочу сериализовать фильм следующим образом:

<Movie>
    <Name>Casino Royale</Name>
    <LeadActor>Daniel Craig</LeadActor>
</Movie>

Единственный способ заставить его работать, это модифицировать Movie, чтобы иметь свойство LeadActor, которое объединит свойство Actor и создаст оба свойства Actor с атрибутом [XmlIgnore]. Но что, если я не хочу изменять эти бизнес-объекты?

Ответы [ 4 ]

2 голосов
/ 24 августа 2011

Если структура данных xml известна (и не слишком сложна), я считаю использование Xml.Linq самым простым способом. Каждый класс содержит открытый статический метод для восстановления себя из XML. Вы должны сделать это вручную, но если структура xml не соответствует структуре объекта, что кажется единственным способом - и этот довольно прост.
Для вашего примера это будет:

public class Movie {
    public string Name;
    public Actor LeadActor;
    public static Movie FromXml (XElement x)
    {
        Movie m = new Movie();
        m.Name = x.Element("Name").Value;
        m.LeadActor = Actor.FromXml(x.Element("LeadActor"));
        return m;
    }
}

public class Actor {
    public string Name;
    public DateTime DOB;
    public static Actor FromXml (XElement x)
    {
        Actor a = new Actor();
        a.Name = x.Value;
        a.DOB = ... 
        return a;
    }
}
1 голос
/ 24 августа 2011

Атрибут [Serializable] разрешил двоичную сериализацию, а не сериализацию Xml. Для поддержки XML-сериализации объект должен иметь конструктор по умолчанию и общедоступные настраиваемые свойства. Если ваша объектная модель отвечает этому требованию, я бы рассмотрел использование встроенной XML-сериализации - это экономит время в долгосрочной перспективе.

0 голосов
/ 28 мая 2015

Вы можете использовать преобразование xslt, чтобы преобразовать исходный xml в формат xml, соответствующий вашей объектной модели, и затем напрямую десериализовать преобразованный xml в объекты.

0 голосов
/ 24 августа 2011

Вы можете реализовать IXmlSerializable на объекте верхнего уровня, чтобы выполнить некоторую настраиваемую сериализацию.

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