Comparación de generadores de código XSD

Estoy investigando la generación de código a partir de los archivos de esquema xsd. Mis requisitos:

  • Debe generar código C # 2.0 (o superior), utilizando colecciones genéricas cuando sea necesario.
  • Debe generar comentarios a partir de los comentarios xsd
  • Debe generar código completamente serializable.
  • Debería ser capaz de generar tipos de línea reutilizables al generar desde múltiples xsd con los mismos includes.

(vea también mis otras preguntas: ¿Cómo puedo generar múltiples clases de xsd con includes comunes? y ¿Cómo puedo generar comentarios de xs: tags de documentación en wsdl?

He encontrado las siguientes opciones:

  1. Use xsd.exe (suministrado con el SDK y Visual Studio)
  2. XSDCodeGen de Daniel Cazzulino
  3. Xsd2Code
  4. CodeXS
  5. XsdObjectGen por Microsoft
  6. XSDClassGen (Parece que falta en acción)

¿Extrañé alguno? Porque (1), (2) y (5) no generan código 2.0, y tengo problemas con la serialización del código desde (3). ¿Qué usas cuando generas código?

Creo que XSD2Code es la mejor herramienta actualmente disponible (en 2011).

Recientemente realicé el mismo proceso de análisis de las herramientas disponibles, así que pensé en proporcionar una respuesta actualizada relacionada con VS2010 .

Nuestro principal impulsor fue que xsd.exe no genera documentos XML a partir de las anotaciones XSD, que queríamos porque tenemos cientos de definiciones de tipos. Probé todas las herramientas enumeradas anteriormente y otras, y la mayoría fueron obsoletas, no se mantuvieron o no pudieron coincidir con la funcionalidad actual de xsd.exe disponible en VS2010.

Sin embargo, Xsd2Code es una herramienta excelente y parece que se mantiene activamente. Proporciona toda la funcionalidad que se mencionó anteriormente y mucho más: la página CodePlex también tiene excelentes ejemplos de cómo las distintas opciones afectan la producción.

También tiene una estrecha integración con VS, incluida la integración del menú de contexto y una herramienta de comstackción personalizada (lo que significa que si hace referencia a los XSD en su proyecto y especifica la herramienta personalizada, actualizará automáticamente el código a medida que actualice el XSD). En general, nos ahorró mucho trabajo.

Un resumen rápido de las otras herramientas que vi:

  • Dingo : parece estar más alineado con Java
  • XSDCodeGen: más de una demostración sobre cómo escribir una herramienta de comstackción personalizada
  • CodeXS : una herramienta bastante buena, pero con menos funciones de integración y que ya no se mantiene
  • XSDObjectGen: ya no se mantiene, menos funcionalidad que xsd.exe actual
  • XSDClassGen – No se pudo ubicar
  • Biblioteca OXM : recomendar mirar este proyecto, mantener y una gran funcionalidad
  • LINQ to XSD : proyecto muy bueno , pero no lo que estaba buscando

Adición: Si decide seguir adelante con XSD2Code, hay una serie de problemas que encontré trabajando con la herramienta de línea de comandos. En particular, hay algunos errores con el procesamiento de argumentos que requieren que algunos argumentos estén en cierto orden, así como algunas dependencias no documentadas (por ejemplo, los parámetros automáticos y la versión .NET son específicos de la orden y dependen de ella). Los siguientes son los pasos que utilicé para generar el código usando XSD2Code y luego limpiar la salida: tome los bits que le correspondan según sea necesario:

Ejecute el siguiente archivo por lotes para generar el código inicial, cambiando las rutas a las ubicaciones correctas:

@echo off set XsdPath=C:\schemas set OutPath=%XsdPath%\Code set ExePath=C:\Progra~1\Xsd2Code set Namespace=InsertNamespaceHere echo.Starting processing XSD files ... for /f %%a IN ('dir %XsdPath%\*.xsd /ad /b /s') do call:ProcessXsd %%a echo.Finished processing XSD files ... echo.&pause& goto:eof :ProcessXsd %ExePath%\Xsd2Code %~1 %Namespace% %XsdPath%\Code\%~n1%.cs /pl Net35 /if- /dc /sc /eit echo.Processed %~n1 goto:eof 

Realice los siguientes pasos para ordenar el código generado, según sea necesario:

  1. Regex replace – proyecto actual, caso, palabra completa – [System.Runtime.Serialization.DataContractAttribute (Nombre: b * =: b *: q ,: b Namespace: b =: b * {: q})] con [DataContract ( Namespace = \ 1)]
  2. Reemplazar – proyecto actual, caso, palabra completa – [System.Runtime.Serialization.DataMemberAttribute ()] con [DataMember]
  3. Regex replace – proyecto actual, caso, palabra completa – System.Nullable \ <{: w}> con \ 1 \?
  4. Regex replace – abrir documentos, mayúsculas y minúsculas – {: w} TYPE con \ 1
  5. Reemplazar: abra documentos, mayúsculas y minúsculas, System.DateTime con DateTime , luego agregue las instrucciones que faltan.
  6. Reemplazar – abrir documentos, mayúsculas y minúsculas – [System.Xml.Serialization.XmlIgnoreAttribute ()] con [XmlIgnore]
  7. Reemplazar – proyecto actual – System.Xml.Serialization.XmlArrayAttribute con XmlArray
  8. Reemplazar – proyecto actual – System.Xml.Serialization.XmlArrayItemAttribute con XmlArrayItem
  9. Regex replace – proyecto actual – , [: Wh] + /// \ con ,

Espero que ayude a alguien.

Todavía no lo he comprobado, pero Linq2XSD podría ser una alternativa útil.

Voy a darle una oportunidad. LINQ con generación XSD sería mejor que cualquiera de estas herramientas que mencionó, siempre que funcione bien.

El proyecto OpenSource XSD to Classes funcionó perfecto para mí.

Hace un año, hace un año, utilizamos CodeXS. Con algunos ajustes menores (un script que limpió el código generado un poco) funcionó un encanto.

También hay Dingo , que tiene algunas características de extensibilidad muy buenas (que no necesitamos).

Pruebe OxmLibrary – http://oxmlibrary.codeplex.com

El mejor generador de clases XSD que he encontrado es thinktecture WSCF.blue . Es mejor que la mayoría de los otros por dos razones:

  1. Corrige el nombre. Eso significa cubrir y plurization de tipos y nombres de propiedad.
  2. Crea un archivo separado para cada clase.

O bien, si está buscando una solución T4, puede probar XsdClassGen . Este no está funcionando para mí. Pero la buena noticia es que es un archivo T4, ¡así que es fácil de arreglar!

Aquí hay un ejemplo basado en web de usar XSLT para transformar código XML a C #. El ejemplo toma un modelo (XML) que describe los servicios (básicamente nombres de servicios, espacios de nombres y lista de operaciones), luego genera servicios WCF (interfaces, mensajes, fallas, pruebas, etc.) todo en C # .net.