如何轻松地将多态类型从XML反序列化为POCO(使用XML Schema)?

时间:2011-01-09 21:39:47

标签: c# xsd polymorphism xml-parsing xml-deserialization

假设我想解析任何这些XML元素:

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

遵循以下XML Schema声明:

<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 Schema实际上是否有助于XML-to-CLR类型映射?

  • XML-to-CLR类型映射的声明性解决方案很不错,例如通过C#属性。
  • 可选属性应正确转换为可空类型。
  • <Server xsi:type="WebServer" ... />应该会生成WebServer个对象。

1 个答案:

答案 0 :(得分:1)

.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