これらの 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# 属性を介して行うとよいでしょう。
- オプションの属性は、null 許容型に正しく変換する必要があります。
<Server xsi:type="WebServer" ... />
WebServer
オブジェクトになるはずです。