Предположим, я хочу проанализировать любой из этих элементов 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 #.
- Необязательные атрибуты должны быть правильно преобразованы в обнуляемые типы.
<Server xsi:type="WebServer" ... />
должен привести к созданию объекта WebServer
.