2010-03-05 16 views
15

Estoy intentando crear algunas clases para poder deserializar un archivo XML creado por una aplicación de terceros. Afortunadamente, el desarrollador de la aplicación de terceros incluyó un archivo de esquema con su código para que se pueda entender el archivo XML.XSD.exe y "referencias de grupo circular"

Cuando se utiliza la herramienta XSD.exe desde Visual Studio el proceso falla informar del error siguiente

" 'SegGroupOrSegmentGrouping' Grupo de targetNamespace = '' tiene definición válida: Circular de referencia de grupo."

Me agradecería cualquier ayuda sobre cómo puedo generar los archivos de clase a la luz de este error. Una copia del archivo de esquema se puede encontrar aquí: schema file

+0

Después de investigar un poco más, parece que hay varios problemas con la herramienta XSD.exe. Estoy progresando usando la herramienta de generación de código de una herramienta de terceros que generó el código C# del esquema sin ningún problema (y genera también mejores archivos de clase). –

+0

¿Qué herramienta de terceros usó porque tengo el mismo problema? – jitm

+0

BENBUN, ¿podría hablarnos de la herramienta, por favor? – Yurik

Respuesta

12

tenía este mismo problema hace poco,

Me dieron un esquema de una tercera empresa que regresaban de una estructura XML de un servicio web. Luego quise deserializar la respuesta y almacenar la información en una base de datos con NHibernate.

No hay problema, pensé que usaría xsd.exe y tendré mis clases. Lamentablemente esto no fue así. Xsd.exe falló con exactamente el mismo error que está recibiendo. Esto se debe a que no puede resolver las referencias circulares.

Pasé unos días buscando alternativas hasta que al final escribí mi propia estructura de clases en el esquema y pude deserializar perfectamente. La respuesta aquí es escribir sus propias clases de C# y decorarlas con los atributos apropiados.

Ahórrese algo de tiempo y dolor y no continúe intentando generar las clases que necesita automáticamente al final, aunque el tiempo que consuma las clases que escriba no hará los compromisos que la mayoría de las herramientas (que no funcionan a la perfección) te hará hacer.

Me tomó alrededor de 3 días escribir la estructura de la clase (era grande) pero terminé con una solución de calidad.

Una cosa es segura de que no podrá usar xsd.exe y la mayoría de las otras herramientas que probé después de buscar en Google, o bien no funcionaban correctamente o tenían errores.

+2

Krystan - Tengo que estar de acuerdo, ese fue exactamente mi hallazgo también. Terminé escribiendo las clases a mano. –

+1

Acabo de tener el mismo problema, pero lo resolví sin codificación manual, solo mediante la ejecución incremental de xsd.exe en archivos xsd modificados. http://devio.wordpress.com/2012/05/22/decision-with-circular-group-reference-errors-in-xsd-exe/ – devio

+1

El enfoque incremental funcionaría pero no sería bueno si alguna vez necesitas generar de manera automatizada y modificando los xsds es un total no-no si usted no es el propietario. Solo mi $ 0.02 –

2

Después de probar varias herramientas de terceros, encontré que Liquid Technologies tiene un generador muy robusto llamado Liquid XML Data Binder 2012. Pudo manejar el problema de referencia de grupo circular que enfrenté. Puede generar código para casi cualquier versión de .net desde 2.0 en adelante. Las clases que genera dependen de un dll redistribuible que proporcionan. Estoy usando la versión de prueba y no me sorprendería si fuera necesaria la compra de la versión completa antes de lanzarla. Sin embargo, después de haberme ahorrado probablemente cien horas o más de codificación manual propensa a errores, no me puedo quejar.

0

El método más fácil para mí es crear el archivo XSD del archivo XML real con XSD.EXE. Luego crea una clase del nuevo archivo XSD. Se le puede solicitar que modifique la clase periódicamente si se introducen nodos o tipos que no existían en el XML original, pero se ahorrará HORAS de tiempo de codificación.

7

Intente utilizar svcutil; puede manejar las referencias circulares.

En el siguiente ejemplo, eExact-Schema.xsd es un XSD que xsd.exe no puede manejar.

Ejemplo:

C:\SRC\Exact>svcutil eExact-Schema.xsd /language:C# /dataContractOnly /importxmltypes /out:exact.cs 

Esto es siempre un buen punto de partida; ahora puede usar esta clase y modificarla para adaptarla a su estilo/necesidades, agregar comentarios, etc., y le ahorrará mucho tiempo/buscando hacerlo todo desde cero.

+1

Loco. Esto creó toda la gran cantidad de clases de la especificación OpenCollada, mientras que XSD falló de inmediato. ¡Bonito! –