Нет простого способа обойти это.
Настройка поведения xsd.exe
вообще возможна, даже проста. Это просто тонкий слой поверх .NET-библиотек (System.Xml). Но эти библиотеки не понимают XSD 1.1, поэтому вам понадобится документ XSD 1.0 для их загрузки. И если вы можете преобразовать свои схемы на более старый язык спецификаций, вы также можете использовать неизмененный xsd.exe
.
Не могли бы вы преобразовать схему XSD 1.1 в схему XSD 1.0 для ваших целей? В некоторых случаях это может быть легко. Например, очень простое преобразование XSLT может отфильтровывать утверждения, заменять новые типы данных подходящими типами данных XSD 1.0 и т.п. Однако в целом ситуация находится где-то между сложным и неразрешимым. Давайте посмотрим, где XSD 1.1 добавляет функции, которые нельзя просто игнорировать:
<complexType name="base">
<complexContent>
<sequence>
<element ref="tns:a" minOccurs="0" maxOccurs="1"/>
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="tns:b"/>
<element ref="tns:c"/>
</choice>
</sequence>
</complexContent>
</complexType>
<complexType name="derived">
<complexContent>
<restriction base="tns:base">
<sequence>
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="tns:b"/>
<element ref="tns:c"/>
</choice>
</sequence>
</restriction>
</complexContent>
</complexType>
(Пример взят из здесь. Это отличная отправная точка для оценки могут ли ваши конкретные схемы быть выражены или преобразованы в XSD 1.0.)
В примере показано довольно естественное использование наследования в XSD 1.1. Все, что на самом деле делает производный тип, - это запрещает член tns:a
. Чтобы сделать то же самое в XSD 1.0, тип должен перечислить tns:a
с помощью maxOccurs='0'
, а соответствующий класс C # будет содержать член a
, хотите вы этого или нет. Такое преобразование для понижения версии (с XSD 1.1 на XSD 1.0) по-прежнему относительно легко собрать, чтобы служить этому простому примеру, но в основном невозможно, когда вам нужно сопоставить частицы по всей иерархии наследования с такими ограниченными необязательными членами и / или подстановочными знаками. XSD 1.0 просто недостаточно выразителен.
Теперь к общему вопросу. Предположим, что ваши схемы заранее неизвестны и / или активно используют новые функции XSD 1.1. Вы не сможете преобразовать их в XSD 1.0, поэтому библиотека базовых классов .NET не поможет вам сгенерировать из них классы C #. У вас осталось два или три варианта:
- Вы можете создать классы десериализации вручную. Вы не сможете проверить и десериализовать, но вы сможете десериализовать действительный документ, включая принудительное применение правильных значений атрибутов по умолчанию (типичный побочный эффект проверки, который вы захотите сохранить).
- Вы можете создать собственную поддержку синтаксического анализа XSD 1.1. Очень большой проект, хотя вы можете игнорировать большую часть схемы (например, всю спецификацию XSLT 2.0 для утверждений) и все же иметь возможность получить несколько естественные классы C #.
- Вы можете использовать существующую стороннюю библиотеку с этой функцией. Подозреваю, что на данный момент это пустой набор, из которого можно выбирать. API Saxon не генерирует классы десериализации из схемы. И мне неизвестны другие реализации XSD 1.1, доступные на платформе .NET.
person
Jirka Hanika
schedule
14.04.2015