【发布时间】:2011-01-09 21:39:46
【问题描述】:
假设我想解析这些 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对象。
【问题讨论】:
-
我建议您创建一个简单的类层次结构,然后使用 XML Serializer 对其进行序列化;调整使某些元素成为属性并再次序列化;然后检查它是否不够好,尽管不匹配您的架构。
标签: c# xsd polymorphism xml-parsing xml-deserialization