Как легко десериализовать полиморфные типы из XML в POCO (используя схему XML)? - PullRequest
0 голосов
/ 10 января 2011

Предположим, я хочу проанализировать любой из этих элементов XML:

<Server                      hostName="foobar"                      />
<WebServer                   hostName="foobar"                      />
<WebServer                   hostName="foobar" listeningOnPort="80" />
<Server xsi:type="WebServer" hostName="foobar" listeningOnPort="80" />

, которые придерживаются следующих объявлений схемы XML:

<xsd:element name="Server" type="IServer" />
<xsd:element name="WebServer" substitutionGroup="Server" type="IWebServer" />

<xsd:complexType name="IServer">
  <xsd:attribute name="hostName" type="xsd:string" use="required" />
</xsd:complexType>

<xsd:complexType name="IWebServer">
  <xsd:complexContent>
    <xsd:extension base="IServer">
      <xsd:attribute name="listeningOnPort" type="xsd:int" use="optional" />
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>

для соответствующих объектов CLR следующих типов:

class Server : IServer { .. }               // [CorrespondsTo("Server")]
class WebServer : Server, IWebServer { .. } // [CorrespondsTo("WebServer")]

interface IServer                           // [CorrespondsTo("IServer")]
{
    string HostName { get; set; }           // [CorrespondsTo("hostName")]
}

interface IWebServer : IServer              // [CorrespondsTo("IWebServer")]
{
    int? ListeningOnPort { get; set; }      // [CorrespondsTo("listeningOnPort")]
}

Есть ли что-то в среде .NET или какой-либо зрелой, легкой библиотеке синтаксического анализа XML, которая позволит мне без необходимости писать много кода?Помогает ли на самом деле наличие XML-схемы с сопоставлением типов XML-CLR?

  • Было бы неплохо декларативное решение для сопоставлений типов XML-CLR, например, с помощью атрибутов C #.
  • Необязательные атрибуты должны быть правильно преобразованы в обнуляемые типы.
  • <Server xsi:type="WebServer" ... /> должен привести к созданию объекта WebServer.

1 Ответ

1 голос
/ 10 января 2011

.NET изначально поддерживает сериализацию XML в CLR.

Существует инструмент командной строки под названием «XSD.exe», который принимает серию документов .xsd и создает соответствующие объекты C #.

http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx

Затем вкод, вы используете класс XmlSerializer для сериализации и десериализации.

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

...