Преобразовать схему XSD 1.1 в класс C#

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

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

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

2 ответа

Решение

Там нет простого способа обойти это.

Пользовательская настройка 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.

Я знаю, что это запоздало на несколько лет, но у нас есть инструмент Liquid XML Objects , который является прямой заменой Microsoft XSD.exe и поддерживает XSD 1.1.

Также доступно расширение Visual Studio для создания кода непосредственно в вашем проекте C# или Visual Basic .Net.

Это коммерческий продукт, но для использования в небольших проектах доступна бесплатная версия сообщества.

Другие вопросы по тегам