Десериализовать XML с различными схемами в общий тип - PullRequest
0 голосов
/ 01 марта 2011

Используя c #, я хочу десериализовать xml из различных источников в объекты общего типа.XML не будет иметь ту же схему.Например, в следующем xml /thingContainer/thing/name и widget/@title оба будут отображаться в myClass.DisplayName.

Xml1:

<thingContainer>
    <thing>
        <name>MyName</name>
    </thing>
</thingContainer>

Xml2:

<widget title="myTitle" />

Поэтому я не могу пометить свой класс [XmlElement], так как он будет отличаться в зависимости от источника моего xml.Есть ли какой-то трюк, который я могу сделать с наследованием или некоторый вспомогательный класс, который позволит мне легко десериализовать XML из разных источников?Есть ли какой-нибудь простой способ сопоставить поля класса с xpaths?

Конечно, если мне придется, я буду анализировать и десериализовать xml вручную ... но что это за забава?

Ответы [ 2 ]

1 голос
/ 01 марта 2011

Две мысли, которые сразу приходят на ум:

  • Используйте XSLT для преобразования исходного XML в промежуточный формат, соответствующий вашей объектной модели (очень популярный подход, хотя лично я презираю XSL)
  • Создайте временные объектные модели для десериализации, а затем сопоставьте их с вашей конечной объектной моделью.

Возможно, возможны некоторые хакерские операции с XmlElement, но, похоже, это будет грязный подход.

0 голосов
/ 01 марта 2011

Я думаю, у вас есть два варианта:

  1. Реализация IXmlSerializable для вашего класса и десериализация с учетом структуры вашего XML
  2. Просто используйте LINQ to XML для анализа XML и создания экземпляра вашего класса. Это подход, который я бы выбрал (сам выбрав первый вариант и не любя его)
...