Преобразование схемы XSD 1.1 в класс c #

Мне нужно преобразовать схему XSD 1.1 в класс C #. Проблема в том, что xsd.exe не поддерживает XSD 1.1, на самом деле, если я попытаюсь создать класс C # из этой схемы, я получаю эту ошибку:

Схема проверки уведомления: элемент 'http://www.w3.org/2001/XMLSchema:assert 'не поддерживается в этом контексте.

Как я могу это обойти?


person user3568107    schedule 13.01.2015    source источник


Ответы (1)


Нет простого способа обойти это.

Настройка поведения 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
comment
Спасибо Jirka, ваш ответ очень исчерпывающий; к сожалению, я очень спешил с интеграцией, поэтому я воспользовался уловкой: я удалил тег 1.1, который, к счастью, был только assert! :) - person user3568107; 12.05.2015
comment
@ user3568107 - Не стесняйтесь расширить свой опыт до параллельного ответа, или я могу отредактировать свой, чтобы сделать это более очевидным для большой группы людей, которым почти нужны только схемы 1.0. - person Jirka Hanika; 12.05.2015