¿Cómo generar documentos XML de muestra desde su DTD o XSD?

186

Estamos desarrollando una aplicación que involucra una cantidad sustancial de transformaciones XML. No tenemos datos de prueba de entrada adecuados per se, solo archivos DTD o XSD. Nos gustaría generar nuestros datos de prueba nosotros mismos a partir de estos archivos. ¿Hay una manera fácil / gratuita de hacer eso?

Editar

Aparentemente no hay herramientas gratuitas para esto, y estoy de acuerdo en que OxygenXML es una de las mejores herramientas para esto.

lindelof
fuente
8
No veo las respuestas a estas preguntas que no se ajustan al formato de preguntas y respuestas, o solicitodebate, arguments, polling, or extended discussion
mjn

Respuestas:

29

Creo que Oxygen ( http://www.oxygenxml.com/ ) también lo hace, pero ese es otro producto comercial. Sin embargo, es agradable ... Lo recomiendo encarecidamente para cualquiera que haga mucho trabajo XML. También viene en un buen complemento de Eclipse.

Creo que hay una prueba gratuita de 30 días con todas las funciones.

Levand
fuente
Tengo un montón de XSD que a su vez hereda esquemas de diferentes XSD y necesito generar un archivo XML para probar desde este XSD, estoy usando oxygenXML para hacer esto, pero cuando trato de hacerlo, no funciona para mí y dice por favor defina el nodo raíz pero no me permite hacerlo. Entonces, si alguien hubiera trabajado con oxygenXML, ¿sugiere qué podría ser posible para esto?
Rachel
Gracias Tierland. ¡Esto también respondió a mi pregunta! Si desea venir a responder mi pregunta: stackoverflow.com/questions/7041388/… , estaría más que feliz de marcar la suya como la respuesta.
Eric H
179

En Visual Studio 2008 SP1 y versiones posteriores, el Explorador de esquemas XML puede crear un documento XML con algunos datos de muestra básicos:

  1. Abre tu documento XSD
  2. Cambiar al Explorador de esquemas XML
  3. Haga clic derecho en el nodo raíz y elija "Generar Xml de muestra"

Captura de pantalla del Explorador de esquemas XML

Sam Warwick
fuente
15
Sí, esta es la forma más fácil. Abra XSD, cambie al Explorador de esquemas XML, seleccione el nodo raíz, haga clic derecho y elija "Generar Xml de muestra".
balint
+1 Gracias @Sam Warwick y @balint. ¡Esto fue realmente útil!
jessegavin
3
Utilicé esto con VS2008, pero no puedo encontrar esto en VS2010. ¿Alguien puede confirmar que esto todavía existe?
Simon
Igual que Simon: tampoco puedo encontrar esto en VS2010. Según MSDN, todavía debería estar allí, pero simplemente no aparecerá en ningún lugar de la interfaz de usuario ... :-(
Martijn
66
@ Simon: solo obtienes el "Generar XML de muestra" cuando haces clic derecho en uno de los elementos en el explorador de esquemas. Los elementos se representan gráficamente mediante los corchetes verdes de ángulo izquierdo / derecho: "<>". Probablemente esté haciendo clic derecho en un tipo, y el mensaje de generación solo lo generará para elementos (lo cual tiene sentido).
Miguel Sevilla
126

En versiones recientes del IDE de Eclipse gratuito y de código abierto , puede generar documentos XML a partir de archivos DTD y XSD. Haga clic derecho en un archivo * .dtd o * .xsd determinado y seleccione "Generar -> Archivo XML ...". Puede elegir qué elemento raíz generar y si se deben generar atributos y elementos opcionales.

Por supuesto, también puede usar Eclipse para crear y editar sus archivos de esquema DTD y XSD. Y no necesita instalar ningún complemento. Está incluido en la distribución estándar.

Florian Fankhauser
fuente
¡Gracias! Eclipse es gratis, y esta fue la solución perfecta.
Akku
¿Saben ustedes qué característica de Eclipse proporciona esta funcionalidad? Mi submenú "Generar" tiene "Clases JAXB" como único elemento.
otto.poellath
9
Debe instalar el Proyecto de herramientas web (consulte Ayuda-> Instalar nuevo software) para obtener estas opciones.
Pwaring
3
Eclipse parece una buena opción, pero no pude lograr que la generación siguiera los XSD importados. Por ejemplo, si tuviera un XSD que describiera 3 elementos, y uno de ellos fuera un tipo complejo que se definió en un XSD referenciado / importado, no se generaría para ese elemento. ¿Algunas ideas?
David Hergert
@DavidHergert Una solución simple sería generar un tipo de código auxiliar.
Adam Matan
32

Para usuarios de Intellij Idea:

Echa un vistazo a Herramientas -> Acciones XML

ingrese la descripción de la imagen aquí

Parece funcionar muy bien (por lo que he probado).

Editar:

Como mencionó @naXa, ahora también puede hacer clic derecho en el archivo XSD y hacer clic en "Generar documento XML a partir del esquema XSD ..."

yamass
fuente
¿Hay alguna manera de especificar el número de elementos a generar (para secuencias)?
Nikita
Probé cada solución de este hilo y funcionó mejor
FLX
1
No funciona para mí en el último RubyMine (v. 7.0, basado en Intellij Idea) con XSD con muchas importaciones. No tengo nada más que un mensaje de error.
Envek
3
¿"Error de compilación de esquema"?
The Red Pea
1
En versiones más recientes, haga clic derecho en XSD y seleccione "Generar documento XML a partir del esquema XSD ..."
naXa
12

El camprocesador disponible en Sourceforge.net realizará la generación de casos de prueba xml para cualquier XSD. Hay un tutorial disponible para mostrarle cómo generar sus propios ejemplos de prueba, incluido el uso de sugerencias de contenido para garantizar ejemplos realistas, no solo basura basura aleatoria.

El tutorial está disponible aquí: http://www.oasis-open.org/committees/download.php/29661/XSD%20and%20jCAM%20tutorial.pdf

Y puede encontrar más información sobre la herramienta, que está utilizando el estándar del Mecanismo de ensamblaje de contenido (CAM) de OASIS para refactorizar su XSD en una estructura más amigable con XSLT, en el sitio web de recursos: http://www.jcam.org.uk

Disfruta, DW


fuente
3
El enlace directo a la descarga de Sourceforge.net es: sourceforge.net/projects/camprocessor
@Pyderman, esa es tu configuración, busca cómo cambiarlos.
Ghoti
10

Puede utilizar el Generador de instancias XML que forma parte del Validador de esquemas múltiples de Sun / Oracle .

Es README.txt dice:

Sun XML Generator es una herramienta Java para generar varias instancias XML a partir de varios tipos de esquemas. Es compatible con DTD, RELAX Namespace, RELAX Core, TREX y un subconjunto de W3C XML Schema Parte 1. [...]

Esta es una herramienta de línea de comandos que puede generar instancias válidas e inválidas a partir de esquemas. Se puede utilizar para generar casos de prueba para aplicaciones XML que necesitan ajustarse a un esquema particular.

Descargue y descomprima xmlgen.zipdesde la página de descarga de msv y ejecute el siguiente comando para obtener instrucciones de uso detalladas:

java -jar xmlgen.jar -help

La herramienta parece ser lanzada bajo una licencia BSD; el código fuente es accesible desde aquí

falko
fuente
¡Muy agradable! Aunque un poco limitado. Lo probé en un XSD que importa otros XSD y falló. Pero en un DTD funciona muy bien. ¡Gracias!
lindelof
1
Enlaces actuales: página de inicio , descargas . xmlgen.zipsolo en el nigthlydirectorio Confirmo la imposibilidad de generar una muestra de mi xsd.
Jarekczek
En mi caso, necesitaba usar el --examplearchivo para contener tokens que se pueden usar para generar un nuevo archivo de muestra. ¡Se necesita una muestra para hacer una muestra! No es fácil ...
The Red Pea
Los enlaces de java.net están básicamente muertos.
RedGrittyBrick
10

XMLSpy lo hace por ti, aunque eso no es gratis ...

Creo que Liquid Xml Studio lo hace por usted y es gratis, pero no lo he usado personalmente para crear datos de prueba.

SCdF
fuente
Se genera algo, pero no tienen mucho control sobre él: se puede elegir el elemento de nivel superior y algunas opciones generales, pero no se puede utilizar XMLSpy para generar un conjunto de casos de prueba con muchas variantes, etc.
Hans-Peter Storr
XMLSpy se veía bien pero generó xml que luego no pudo validar contra el xsd que se usó para generarlo. Fallar. También vomitó en un postiveintegercampo, colocando *ERROR*en su lugar
Tim Abell el
7

Parece que nadie pudo responder la pregunta hasta ahora :)

Utilizo MOXy de EclipseLink para generar dinámicamente clases de enlace y luego revisar recursivamente los tipos enlazados. Es algo pesado, pero permite la inyección de valor XPath una vez que se instancia el árbol de objetos:

InputStream in = new FileInputStream(PATH_TO_XSD);
DynamicJAXBContext jaxbContext = 
            DynamicJAXBContextFactory.createContextFromXSD(in, null, Thread.currentThread().getContextClassLoader(), null);
DynamicType rootType = jaxbContext.getDynamicType(YOUR_ROOT_TYPE);
DynamicEntity root = rootType.newDynamicEntity();
traverseProps(jaxbContext, root, rootType, 0);

TraverseProps es un método recursivo bastante simple:

private void traverseProps(DynamicJAXBContext c, DynamicEntity e, DynamicType t, int level) throws DynamicException, InstantiationException, IllegalAccessException{
        if (t!=null) {
            logger.info(indent(level) + "type [" + t.getName() + "] of class [" + t.getClassName() + "] has " + t.getNumberOfProperties() + " props");
            for (String pName:t.getPropertiesNames()){
                Class<?> clazz = t.getPropertyType(pName);
                logger.info(indent(level) + "prop [" + pName + "] in type: " + clazz);
                //logger.info("prop [" + pName + "] in entity: " + e.get(pName));

                if (clazz==null){
                    // need to create an instance of object
                    String updatedClassName = pName.substring(0, 1).toUpperCase() + pName.substring(1);
                    logger.info(indent(level) + "Creating new type instance for " + pName + " using following class name: " + updatedClassName );
                    DynamicType child = c.getDynamicType("generated." + updatedClassName);
                    DynamicEntity childEntity = child.newDynamicEntity();
                    e.set(pName, childEntity);
                    traverseProps(c, childEntity, child, level+1);
                } else {
                    // just set empty value
                    e.set(pName, clazz.newInstance());
                }
            }
        } else {
            logger.warn("type is null");
        }
    }

Convertir todo a XML es bastante fácil:

Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
Michal Rames
fuente
7

También puede usar XMLPad (de uso gratuito) que se encuentra aquí http://www.wmhelp.com para generar sus muestras xml. Desde el menú: XSD -> generar un archivo XML de muestra.

Pat B
fuente
Aparece un desbordamiento de pila o "WMHelp XmlPad ha dejado de funcionar" cuando elijo "Generar datos de muestra"
The Red Pea
5

Microsoft ha publicado una herramienta de "generador de documentos" como muestra. Este es un artículo que describe la arquitectura y el funcionamiento de la aplicación de muestra con cierto detalle.

Si solo desea ejecutar la herramienta de generación de muestras, haga clic aquí e instale el MSI.

Es gratis. La fuente está disponible. Requiere .NET Framework para ejecutarse. Funciona solo con XSD. (no Relax NG o DTD).

Cheeso
fuente
El enlace de arriba es a un artículo en MSDN llamado 'Generando documentos XML a partir de esquemas XML'
Sam Warwick
El instalador coloca un montón de código C # en su máquina. Simplemente descargue esos en LinqPad y tendrá su generador de instancias XML gratis. Ta dah!
Sean Kearon
9 años después, esto sigue funcionando muy bien para los XSD.
Mikanikal
5

XML-XIG: generador de instancias XML

http://xml-xig.sourceforge.net/

Este código abierto sería útil.

rolandpeng
fuente
1
No es muy fácil de usar. Lanza muchas excepciones, no puede hacer que funcione después de ser inexplicable NullPointerException.
Jarekczek
4

Microsoft Office tiene ' InfoPath ', que toma un XSD como una importación y le permite definir rápida y fácilmente un editor basado en formularios para crear archivos XML. Tiene dos modos: uno donde define el formulario y otro modo donde crea el archivo XML completando el formulario. Creo que llegó por primera vez con Office 2003, y la mayoría de la gente nunca lo instala. Me sorprende lo mucho que me gusta.

Kieveli
fuente
1

XMLBlueprint 7.5 puede hacer lo siguiente: - generar xml de muestra desde dtd - generar xml de muestra a partir del esquema de relajación - generar xml de muestra a partir del esquema xml

Peter
fuente
1

La versión de código abierto de SoapUI puede generar solicitudes SOAP de WSDL (que contiene definiciones de tipo XSD), por lo que parece que hay una implementación de código abierto de esta funcionalidad. Desafortunadamente, no he descubierto a qué biblioteca está acostumbrado esto.

otto.poellath
fuente
1

Liquid XML Studio tiene un asistente de generador de muestras XML que creará archivos XML de muestra a partir de un esquema XML. Los datos resultantes parecen cumplir con el esquema (simplemente no puede generar datos para patrones de expresiones regulares).

Generar una muestra XML desde un XSD

Sprotty
fuente
0

La biblioteca OpenXSD menciona que tienen soporte para generar instancias XML basadas en XSD. Mira eso.

Aravind Yarram
fuente
¿puedes publicar un ejemplo de uso?
naXa