0

假设我想解析这些 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 到 CLR 类型的映射吗?

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

1 回答 1

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

于 2011-01-10T04:08:45.953 回答