2010-01-26 39 views
7

Por alguna razón, la herramienta MS .Net (v3.5) - xsd.exe no genera tipos cuando no se usan dentro de ningún elemento..Net herramienta xsd.exe no genera todos los tipos

p. Ej.

XSD archivo (me tiró en el elemento complejo para evitar esta advertencia - "Advertencia:. No puede generar clases porque no se encontraron elementos de nivel superior con tipo complejo"):

<?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> 

Cuando corro esta a través xsd.exe usando

xsd/c xsdfile.xsd

no veo EnumTest en el archivo generado cs.

Nota; Aunque no utilizo la enumeración aquí, pero en mi proyecto real, tengo casos como este en los que enviamos el valor de cadena de enum como salida.

¿Cómo puedo forzar a la herramienta xsd a incluir esto? ¿O debería cambiar a alguna otra herramienta?

trabajo en Visual Studio 2008.

+0

Su simpleType no es utilizado por ningún elemento ... Se usa, a continuación, inténtelo de nuevo. –

+0

¡supongo que no has leído mi publicación por completo! – Mrchief

+1

Leí tu publicación. Pero si no hay ningún elemento que use el tipo, entonces el sistema no definirá un tipo. Agregue y luego vea qué hace. (Es una cosa de optimización ...) –

Respuesta

5

Voy a tener que concluir esta es una deficiencia estúpida de la herramienta. Tal vez dar un cambio para activar este comportamiento. Al no tener este comportamiento, me veo forzado a crear tipos fuera de xsd y eso crea código fragmentado.

Esta es mi opinión personal y estoy bastante seguro de que hay otros que compartirían lo mismo.

+0

La herramienta genera clases para el esquema. Si el esquema incluyera, por ejemplo, el espacio de nombres XAML, entonces sin la optimización indicada por Wim ten Brink tendría que crear clases para casi todo el mundo de XML. Esto generalmente no es deseado. Si los elementos no se referencian en el esquema, entonces se eliminan. – Pekka

+0

Eso es un caso extremo y no digo hacerlo por cada importación. Solo por mi esquema. Pero, de nuevo, puede tener interruptores para controlar la granularidad de la misma. – Mrchief

+0

Hubiera pensado que el eXtensible en XML sugiere fuertemente que la mayoría de los esquemas importarían otros, pero que la mayoría del software permanecería interesado sólo en sus tipos locales, dejando el resto de los datos como una carga útil no interpretada. También puede haber un malentendido. Los elementos son la interfaz pública, mientras que los tipos son la conveniencia de la notación. Siempre puede definir los elementos con tipos anónimos si solo desea un tipo de artefacto nombrado en el esquema. – Pekka

0

Si no se utiliza la enumeración aquí, o en cualquier otra clase se está generando a través de la herramienta xsd, a continuación, definirlo en su proyecto en otro lugar del mismo modo que sería cualquier otra enumeración. Si es absolutamente necesario que la herramienta xsd cree una clase para usted, la solución de Workshop Alex es la solución más comúnmente utilizada en este caso (ni siquiera lo considero una solución, es realmente muy conveniente poder utilizar el herramienta de esta manera)

1

Me encontré con un problema similar, con xs:complexType no estando dentro de un xs:element, y por lo tanto no se incluye en el archivo cs generado. En nuestro caso, tenemos un archivo wsdl que importa dos archivos xsd, por lo que es posible que esto no se aplique a usted.

En lugar de correr xsd.exe en esos dos archivos XSD, que hizo lo siguiente:

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

que funcionó a las mil maravillas, y generó todo, incluyendo los tipos complejos.

+0

Sí, esa era otra opción en ese momento. Incluso el generador de WCF maneja esto correctamente aunque no está seguro. He estado alejado de xsd durante mucho tiempo, así que no puedo hablar con certeza. – Mrchief

2

Es posible crear enumeraciones dentro del archivo XSD incluso si no tiene la intención de usarlas para la validación.Añadir lo siguiente a la XSD:

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

(donde EnumTest es la enumeración desea ver generado).

El atributo abstract garantiza que el elemento no puede desempeñar el papel del elemento de documento de un documento de instancia. El atributo block es menos importante.

Existen otras formas de lograr el mismo objetivo, como declarar un atributo prohibido con su tipo enumerado en cualquier lugar que desee. Me parece útil para encapsular todos mis enumeraciones no utilizados dentro de un contenedor genérico como esta, para reducir al mínimo las declaraciones globales:

<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> 
+0

Lo que nuevamente me lleva a mi queja inicial: te obliga a declarar al menos un "elemento" no utilizado para que suceda la generación. – Mrchief

+0

@Mrchief - 'xsd.exe' es una capa delgada de clases .NET. No hay nada mágico a su alrededor. Descargue la fuente de 'Xsd2Code', que es un contenedor de código abierto de un tipo similar (mucho más flexible que' xsd.exe' de todos modos) y úselo o adáptelo a sus necesidades si no puede aceptar las imperfecciones cosméticas de 'xsd.exe' . Consulte también [esta pregunta] (http://stackoverflow.com/questions/386155/comparison-of-xsd-codegenerators-c). –

Cuestiones relacionadas