c# - XSD.exe y "referencias de grupo circular"
.net schema (4)
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 el archivo XML se pueda entender.
Cuando uso la herramienta XSD.exe de Visual Studio, el proceso falla al informar el siguiente error
"El grupo ''SegGroupOrSegmentGrouping'' de targetNamespace = '''' tiene una definición no válida: referencia de grupo circular".
Cualquier ayuda en cómo puedo generar los archivos de clase a la luz de este error sería apreciada. Una copia del archivo de esquema se puede encontrar aquí: archivo de esquema
Después de probar varias herramientas de terceros, descubrí que Liquid Technologies tiene un generador muy robusto llamado Liquid XML Data Binder 2012 . Fue capaz de manejar el problema de referencia de grupo circular que enfrenté. Puede generar código para casi cualquier versión de .net a partir de 2.0. Las clases que genera dependen de una dll redistribuible que proporcionan. Estoy usando la versión de prueba y no me sorprendería si fuera necesario comprar la versión completa antes de lanzarla. Sin embargo, habiéndome salvado probablemente cien horas o más de codificación manual propensa a errores, no puedo quejarme.
El método más sencillo para mí es crear el archivo XSD a partir del archivo XML real con XSD.EXE. Luego crea una clase del nuevo archivo XSD. Es posible que deba modificar 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.
Tuve este mismo problema recientemente,
Recibí un esquema de una empresa externa que estaba devolviendo una estructura xml desde 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 solo 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 referencias circulares.
Pasé unos cuantos días buscando alternativas hasta que al final escribí mi propia estructura de clase en el esquema y pude deserializar a la perfección. La respuesta aquí es escribir sus propias clases de C # y decorarlas con los atributos apropiados.
Ahorre tiempo y angustia, y no continúe intentando y genere las clases que necesita automáticamente al final, aunque las clases de escritura que consumen mucho tiempo no comprometerán la mayoría de las herramientas (que no funcionan perfectamente). hacer.
Me tomó cerca de 3 días escribir la estructura de la clase (era grande) pero terminé con una solución de calidad.
Una cosa es cierta: no podrá usar xsd.exe y la mayoría de las otras herramientas que probé después de buscar en Google no funcionaron correctamente o tenían errores.
Trate de usar 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
Este es siempre un buen lugar para comenzar; ahora puede usar esta clase y modificarla para adaptarla a su estilo / necesidades, agregar comentarios, etc., y le ahorrará mucho tiempo / búsqueda en lugar de hacerlo todo desde cero.