假设我想解析这些 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
对象。