Comment générer des exemples de documents XML à partir de leur DTD ou XSD?

186

Nous développons une application qui implique une quantité substantielle de transformations XML. Nous n'avons pas de données de test d'entrée appropriées en soi, uniquement des fichiers DTD ou XSD. Nous aimerions générer nous-mêmes nos données de test à partir de ces fichiers. Existe-t-il un moyen facile / gratuit de le faire?

Éditer

Il n'y a apparemment pas d'outils gratuits pour cela, et je conviens qu'OxygenXML est l'un des meilleurs outils pour cela.

Lindelof
la source
8
Je ne vois pas les réponses à ces questions qui ne correspondent pas au format des questions-réponses, ou qui ne sollicitent pasdebate, arguments, polling, or extended discussion
mjn

Réponses:

29

Je pense qu'Oxygen ( http://www.oxygenxml.com/ ) le fait aussi, mais c'est un autre produit commercial. C'est bien, cependant ... Je le recommande vivement à tous ceux qui font beaucoup de travail XML. Il est également livré dans un joli plugin Eclipse.

Je pense qu'il existe un essai gratuit et complet de 30 jours.

Levand
la source
J'ai un tas de XSD qui héritent à leur tour de schémas de différents XSD et je dois générer un fichier XML à des fins de test à partir de ce XSD, j'utilise OxygenXML pour le faire, mais quand j'essaye de le faire, cela ne fonctionne pas pour moi et il dit s'il vous plaît définir le nœud racine mais cela ne me permet pas de le faire. Donc, si quelqu'un avait travaillé avec OxygenXML, suggérez-vous ce qui pourrait être un moyen de contourner cela?
Rachel
Merci leveland. Cela a également répondu à ma question! Si vous souhaitez venir répondre à ma question: stackoverflow.com/questions/7041388/… , je serais plus qu'heureux de marquer la vôtre comme réponse.
Eric H
179

Dans Visual Studio 2008 SP1 et versions ultérieures, l' Explorateur de schémas XML peut créer un document XML avec des exemples de données de base:

  1. Ouvrez votre document XSD
  2. Basculer vers l'Explorateur de schémas XML
  3. Cliquez avec le bouton droit sur le nœud racine et choisissez "Générer un échantillon Xml"

Capture d'écran de l'explorateur de schéma XML

Sam Warwick
la source
15
oui, c'est le moyen le plus simple. Ouvrez XSD, passez à l'Explorateur de schémas XML, sélectionnez le nœud racine, cliquez avec le bouton droit de la souris et choisissez "Générer un échantillon Xml".
balint
+1 Merci @Sam Warwick et @balint. C'était vraiment utile!
jessegavin
3
Je l'ai utilisé avec VS2008, mais je ne le trouve pas dans VS2010. Quelqu'un peut-il confirmer que cela existe toujours?
Simon
Identique à Simon: je ne trouve pas non plus cela dans VS2010. Selon MSDN, il devrait toujours être là, mais il n'apparaîtra nulle part dans l'interface utilisateur ... :-(
Martijn
6
@Simon: vous n'obtenez le "Generate Sample XML" que lorsque vous faites un clic droit sur l'un des éléments de l'explorateur de schéma. Les éléments sont représentés graphiquement via les crochets angulaires verts gauche / droit: "<>". Vous faites probablement un clic droit sur un type et le message de génération ne le générera que pour les éléments (ce qui est logique).
Miguel Sevilla
126

Dans les versions récentes de l' IDE gratuit et open source Eclipse, vous pouvez générer des documents XML à partir de fichiers DTD et XSD. Cliquez avec le bouton droit sur un fichier * .dtd ou * .xsd donné et sélectionnez "Générer -> Fichier XML ...". Vous pouvez choisir l'élément racine à générer et si les attributs et éléments facultatifs doivent être générés.

Bien sûr, vous pouvez également utiliser Eclipse pour créer et modifier vos fichiers de schéma DTD et XSD. Et vous n'avez pas besoin d'installer de plugins. Il est inclus dans la distribution standard.

Florian Fankhauser
la source
Merci! Eclipse est gratuit, et c'était la solution parfaite.
Akku
Savez-vous quelle fonctionnalité Eclipse fournit cette fonctionnalité? Mon sous-menu "Générer" contient "Classes JAXB" comme seul élément.
otto.poellath
9
Vous devez installer le projet d'outils Web (regardez sous Aide-> Installer un nouveau logiciel) pour obtenir ces options.
pwaring
3
Eclipse semble être une bonne option, mais je n'ai pas pu faire en sorte que la génération suive les XSD importés. Par exemple, si j'avais un XSD décrivant 3 éléments, et l'un d'entre eux était un complexType défini dans un XSD référencé / importé, il ne serait pas généré pour cet élément. Des idées?
David Hergert
@DavidHergert Une solution de contournement simple serait de générer un type de stub.
Adam Matan
32

Pour les utilisateurs d'Intellij Idea:

Jetez un œil à Outils -> Actions XML

entrez la description de l'image ici

Semble très bien fonctionner (pour autant que je l'ai testé).

Éditer:

Comme mentionné par @naXa, vous pouvez maintenant également cliquer avec le bouton droit sur le fichier XSD et cliquer sur "Générer un document XML à partir du schéma XSD ..."

yamass
la source
y a-t-il un moyen de spécifier le nombre d'éléments à générer (pour les séquences)?
Nikita
J'ai testé toutes les solutions de ce fil et cela a fonctionné le mieux
FLX
1
Ne fonctionne pas pour moi dans le dernier RubyMine (v. 7.0, basé sur Intellij Idea) avec XSD avec de nombreuses importations. Je n'ai rien d'autre qu'un message d'erreur.
Envek
3
"Erreur de compilation de schéma"?
The Red Pea
1
Dans les versions plus récentes, cliquez avec le bouton droit sur XSD et sélectionnez "Générer un document XML à partir du schéma XSD ..."
naXa
12

Le camprocesseur disponible sur Sourceforge.net fera la génération de cas de test xml pour n'importe quel XSD. Un didacticiel est disponible pour vous montrer comment générer vos propres exemples de test - y compris l'utilisation d'indices de contenu pour garantir des exemples réalistes, pas seulement des exemples aléatoires.

Le tutoriel est disponible ici: http://www.oasis-open.org/committees/download.php/29661/XSD%20and%20jCAM%20tutorial.pdf

Et plus d'informations sur l'outil - qui utilise la norme OASIS Content Assembly Mechanism (CAM) pour refactoriser votre XSD en une structure plus conviviale XSLT - peuvent être trouvées sur le site Web de ressources - http://www.jcam.org.uk

Profitez, DW


la source
3
Le lien direct vers le téléchargement Sourceforge.net est: sourceforge.net/projects/camprocessor
@Pyderman - ce sont vos paramètres - cherchez comment les modifier.
Ghoti
10

Vous pouvez utiliser le générateur d'instances XML qui fait partie du validateur multi-schémas Sun / Oracle .

C'est README.txt indique:

Sun XML Generator est un outil Java permettant de générer diverses instances XML à partir de plusieurs types de schémas. Il prend en charge DTD, l'espace de noms RELAX, RELAX Core, TREX et un sous-ensemble du schéma XML du W3C, partie 1. [...]

Il s'agit d'un outil de ligne de commande qui peut générer des instances valides et non valides à partir de schémas. Il peut être utilisé pour générer des cas de test pour les applications XML qui doivent se conformer à un schéma particulier.

Téléchargez et décompressez à xmlgen.zippartir de la page de téléchargement msv et exécutez la commande suivante pour obtenir des instructions d'utilisation détaillées:

java -jar xmlgen.jar -help

L'outil semble être publié sous une licence BSD; le code source est accessible d' ici

falko
la source
Très agréable! Un peu limité cependant. Je l'ai essayé sur un XSD qui importe d'autres XSD et cela a échoué. Mais sur une DTD, cela fonctionne très bien. Merci!
lindelof le
1
Liens actuels: page d'accueil , téléchargements . xmlgen.zipuniquement dans le nigthlyrépertoire. Je confirme l'impossibilité de générer un échantillon à partir de mon xsd.
Jarekczek
Dans mon cas, il fallait utiliser le --examplefichier pour contenir des jetons pouvant être utilisés pour générer un nouveau fichier d'exemple. Il faut un échantillon pour en faire un échantillon! Pas facile ...
The Red Pea
Les liens java.net sont fondamentalement morts.
RedGrittyBrick
10

XMLSpy le fait pour vous, même si ce n'est pas gratuit ...

Je pense que Liquid Xml Studio le fait pour vous et est gratuit, mais je ne l'ai pas personnellement utilisé pour créer des données de test.

SCdF
la source
Cela génère quelque chose, mais vous n'avez pas beaucoup de contrôle dessus: vous pouvez choisir l'élément de niveau supérieur et certaines options générales, mais vous ne pouvez pas utiliser XMLSpy pour générer un ensemble de cas de test avec de nombreuses variantes, etc.
Hans-Peter Störr
XMLSpy avait l'air bien mais a généré du xml qui n'a pas pu être validé par rapport au xsd utilisé pour le générer. Échouer. Il a également grillé sur un postiveintegerterrain - mettant *ERROR*à la place
Tim Abell
7

On dirait que personne n'a été en mesure de répondre à la question jusqu'à présent :)

J'utilise MOXy d'EclipseLink pour générer dynamiquement des classes de liaison, puis parcourir de manière récursive les types liés. C'est un peu lourd, mais cela permet l'injection de valeur XPath une fois que l'arborescence d'objets est instanciée:

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 est une méthode récursive assez 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");
        }
    }

Tout convertir en XML est assez simple:

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

Vous pouvez également utiliser XMLPad (gratuit) disponible ici http://www.wmhelp.com pour générer vos exemples XML. Dans le menu: XSD -> générer un exemple de fichier XML.

Pat B
la source
J'obtiens un débordement de pile ou "WMHelp XmlPad a cessé de fonctionner" lorsque je choisis "Générer des exemples de données"
The Red Pea
5

Microsoft a publié un outil "générateur de documents" à titre d'exemple. Cet article décrit en détail l'architecture et le fonctionnement de l'exemple d'application.

Si vous souhaitez simplement exécuter l'outil de génération d'échantillons, cliquez ici et installez le MSI.

C'est gratuit. La source est disponible. Nécessite le .NET Framework pour s'exécuter. Fonctionne uniquement avec les XSD. (pas Relax NG ou DTD).

Cheeso
la source
Le lien ci-dessus renvoie à un article sur MSDN intitulé `` Génération de documents XML à partir de schémas XML ''
Sam Warwick
Le programme d'installation dépose un tas de code C # sur votre machine. Il suffit de les vider dans LinqPad et vous aurez votre générateur d'instances XML gratuit. Et voilà!
Sean Kearon
9 ans plus tard, cela fonctionne toujours très bien pour les XSD.
Mikanikal
5

XML-XIG: générateur d'instances XML

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

Cette source ouverte serait utile.

rolandpeng
la source
1
Pas très convivial. Lève beaucoup d'exceptions, ne peut pas le faire fonctionner après avoir été inexpliqué NullPointerException.
Jarekczek
4

Microsoft Office a « InfoPath », qui prend un XSD comme importation et vous permet de définir rapidement et facilement un éditeur basé sur un formulaire pour créer des fichiers XML. Il a deux modes - un dans lequel vous définissez le formulaire et un autre dans lequel vous créez le fichier XML en remplissant le formulaire. Je pense qu'il est venu pour la première fois avec Office 2003, et la plupart des gens ne l'installent jamais. Cela me choque de voir à quel point je l'aime.

Kieveli
la source
1

XMLBlueprint 7.5 peut faire ce qui suit: - générer un exemple de xml à partir de dtd - générer un exemple de xml à partir d'un schéma relax ng - générer un exemple de xml à partir d'un schéma xml

Peter
la source
1

La version open source de SoapUI peut générer des requêtes SOAP à partir de WSDL (qui contient des définitions de type XSD), il semble donc qu'il existe une implémentation open source de cette fonctionnalité. Malheureusement, je n'ai pas compris à quelle bibliothèque est habituée.

otto.poellath
la source
1

Liquid XML Studio dispose d'un assistant XML Sample Generator qui crée des exemples de fichiers XML à partir d'un schéma XML. Les données résultantes semblent conformes au schéma (elles ne peuvent tout simplement pas générer de données pour les modèles d'expression régulière).

Générer un échantillon XML à partir d'un XSD

Sprotty
la source
0

La bibliothèque OpenXSD mentionne qu'elle prend en charge la génération d'instances XML basées sur XSD. Vérifiez cela.

Aravind Yarram
la source
pouvez-vous s'il vous plaît poster un exemple d'utilisation?
naXa
0

XML Blueprint fait également cela; instructions ici

http://www.xmlblueprint.com/help/html/topic_170.htm

Ce n'est pas gratuit, mais il y a un essai gratuit de 10 jours; cela semble rapide et efficace; malheureusement, ce n'est que Windows.

Bambax
la source