.Чистая 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 является наиболее часто используемым обходным путем в этом случае (я даже не считаю его обходным путем, его на самом деле очень удобно использовать инструмент таким образом)