Comparación de Generadores de Código XSD [cerrado]


Estoy investigando en la generación de código a partir de 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 base resuables al generar desde múltiples xsd con los mismos includes.

(ver también mis otras preguntas: Cómo puedo generar múltiples clases ¿de xsd con inclusiones comunes? y ¿Cómo puedo generar comentarios desde las etiquetas xs:documentation en un 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)

Lo hice ¿te perdiste alguna? Porque (1), (2) y (5) no generan código 2.0, y tengo problemas con serializar código desde (3). ¿Qué se utiliza al generar código?

Author: Community, 2008-12-22

7 answers

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

Recientemente pasé por el mismo proceso en el trabajo de analizar las herramientas disponibles por ahí, así que pensé en proporcionar una respuesta actualizada que se relaciona con VS2010.

Nuestro controlador principal era xsd.exe no genera XML doc a partir de las anotaciones XSD, lo que queríamos ya que tenemos cientos de definiciones de tipos. Probé todas las herramientas enumeradas anteriormente, así como otras y la mayoría fueron ya sea obsoleto, no mantenido o no puede coincidir con la funcionalidad actual de xsd.exe disponible en VS2010.

Xsd2Code sin embargo, es una herramienta excelente y parece mantenerse activamente. Proporciona toda la funcionalidad que se enumeró anteriormente y mucho más: la página de CodePlex también tiene excelentes ejemplos de cómo las diversas opciones afectan la salida.

También tiene una integración VS ajustada, incluida la integración del menú contextual y una herramienta de compilación personalizada (lo que significa que si hace referencia XSD en su proyecto y especifique la herramienta personalizada, se 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 miré:

  • Dingo - Parece estar más alineado con Java
  • XSDCodeGen-Más de una demostración sobre cómo escribir una herramienta de compilación personalizada
  • CodeXS - Bastante buena herramienta, pero menos integración, características y ya no se mantiene
  • XSDObjectGen-No más tiempo de mantenimiento, menos funcionalidad que el xsd actual.exe
  • XSDClassGen-No se pudo localizar
  • Biblioteca OXM - Recomendar mirando este proyecto, mantenido y gran funcionalidad
  • LINQ to XSD - Very cool project, but not what i was looking for{[25]]}

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 hay algunos errores con el procesamiento de argumentos que requieren que algunos argumentos estén en un orden determinado, así como algunas dependencias no documentadas (por ejemplo, los parámetros automáticos y la versión de.NET son específicos del orden y dependientes). Los siguientes son los pasos que utilicé para generar el código usando XSD2Code y luego limpiar la salida - tomar los bits que se aplican a usted según sea necesario:

Ejecute el siguiente archivo por lotes para generar el código inicial, cambiando las rutas al correcto ubicación:

@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 /a-d /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 - [Sistema.Ejecución.Serialización.DataContractAttribute(Name:b*=:b*:q,: b Namespace: b =: b * {: q})] with [DataContract (Namespace = \1)]
  2. Replace - proyecto actual, caso, palabra completa - [Sistema.Ejecución.Serialización.DataMemberAttribute ()] con [DataMember]
  3. Expresiones regulares reemplazar - proyecto actual, caso, palabra completa - Sistema.Nullable\ con \1\?
  4. Regex replace-abrir documentos, caso, palabra completa - {: w} ESCRIBA con \1
  5. Reemplazar - abrir documentos, caso, palabra completa - Sistema.DateTime con DateTime , luego agregue las sentencias faltantes usando
  6. Reemplazar - abrir documentos, caso, palabra completa - [Sistema.XML.Serialización.XmlIgnoreAttribute ()] con [XmlIgnore]
  7. Reemplazar - proyecto actual - Sistema.XML.Serialización.XmlArrayAttribute con XmlArray
  8. Replace - current project - System.XML.Serialización.XmlArrayItemAttribute with XmlArrayItem
  9. Regex replace - current project - , [: Wh]+ / / / \ with ,

Espero que eso ayude a alguien.

 60
Author: Xcalibur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-05 07:01:47

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

Voy a intentarlo. LINQ con generación XSD sería mejor que cualquiera de estas herramientas que mencionaste, siempre y cuando funcione bien.
 8
Author: Simon_Weaver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-04 00:03:29

OpenSource project XSD to Classes funcionó perfecto para mí.

 3
Author: Stef Heyenrath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-04 15:46:03

En un proyecto hace un poco más de un año usamos CodeXS. Con algunos ajustes menores (un script que limpió un poco el código generado) funcionó de maravilla.

También hay Dingo, que tienen algunas características de extensibilidad muy buenas (que no necesitábamos).

 2
Author: Steen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-22 12:50:55
 2
Author: maor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-05 22:14:22

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

  1. Corrige los nombres. Eso significa encapsular y plurización de tipos y nombres de propiedades.
  2. Crea un archivo separado para cada clase.

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

 0
Author: Josh Mouch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-20 00:57:43

Este es un ejemplo basado en la web del uso de XSLT para transformar XML en código C#. El ejemplo toma un modelo (XML) que describe 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.

 0
Author: Paul Fryer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-26 15:20:27