.Чистая xsd можно.exe инструмент не генерирует все типы

по какой-то причине MS .Net (v3.5) инструмент-xsd.exe не генерирует типы, когда они не используются внутри какого-либо элемента.

например

xsd-файл (я бросил сложный элемент, чтобы избежать этого предупреждения - "предупреждение: не удается создать классы, потому что не найдены элементы верхнего уровня со сложным типом."):

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:simpleType name="EnumTest">
    <xs:restriction base="xs:string">
      <xs:enumeration value="item1" />
      <xs:enumeration value="item2" />
      <xs:enumeration value="item3" />
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="myComplexType">
    <xs:attribute name="Name" use="required" type="xs:string"/>
  </xs:complexType>
  <xs:element name="myElem" type="myComplexType"></xs:element>
</xs:schema>

когда я запускаю это через xsd.exe с помощью

xsd / c xsdfile.xsd-схемы

Я не вижу EnumTest в сгенерированный cs файл.

Примечание; хотя я не использую перечисление здесь, но в моем фактическом проекте у меня есть такие случаи, когда мы отправляем строковое значение перечисления в качестве вывода.

Как я могу заставить инструмент xsd включить их? Или переключиться на другой инструмент?

Я работаю в Visual Studio 2008.

5 ответов


Я должен буду заключить, что это глупый недостаток инструмента. Может быть, дать, чтобы включить это поведение. Не имея такого поведения, я вынужден создавать типы за пределами xsd, и это создает фрагментированный код.

Это мое личное мнение, и я уверен, что есть другие, которые разделяют то же самое.


Я знаю, что это очень старый, но он появился в google, когда я искал, и я нашел ответ.

Xsd должен иметь в аренде один XS: элемент, чтобы быть действительным и для xsd.exe для правильной работы.

посмотреть этот Подробнее http://keithelder.net/2008/11/02/creating-a-rest-wcf-service-from-an-existing-xsd-schema/


можно создать перечисления в XSD-файле, даже если вы не собираетесь использовать их для проверки. Добавьте в XSD следующее:

<xs:element name="DummyEnumTest" type="EnumTest" abstract="true" block="#all"/>

(где EnumTest - это перечисление, которое вы хотите видеть сгенерированным).

на abstract атрибут гарантирует, что элемент не может играть роль элемента документа экземпляра документа. The block атрибут менее важен.

есть и другие пути достижения той же цели, как объявление запрещенный атрибут с перечисляемым типом в любом месте. Я считаю полезным инкапсулировать все мои неиспользуемые перечисления в общую оболочку, как это, чтобы минимизировать глобальные объявления:

<xs:element name="ForceGenerationOfBaseEnums" abstract="true" block="#all">
    <xs:complexType>
        <xs:choice>
            <xs:element name="..." type="..."/>
            <xs:element name="..." type="..." />
        </xs:choice>
    </xs:complexType>
</xs:element>

я столкнулся с аналогичной проблемой, с xs:complexType не быть внутри xs:element, и, таким образом, не включается в сгенерированный файл cs. В нашем сценарии у нас есть файл wsdl, который импортирует два xsd-файла, поэтому это может не относиться к вам.

вместо запуска xsd.exe на этих двух xsd-файлах мы сделали следующее:

wsdl.exe /language:CS /out:OutputDir OurService.wsdl first.xsd second.xsd

это работало как шарм и генерировало все, включая сложные типы.


Если вы не используете перечисление здесь или в любом другом классе, который вы генерируете с помощью инструмента xsd, определите его в своем проекте где-нибудь еще, как и любое другое перечисление. Если вам абсолютно необходимо, чтобы инструмент xsd создал для вас класс, то решение Workshop Alex является наиболее часто используемым обходным путем в этом случае (я даже не считаю его обходным путем, его на самом деле очень удобно использовать инструмент таким образом)