Come generare documenti XML di esempio dal loro DTD o XSD?


186

Stiamo sviluppando un'applicazione che comporta una notevole quantità di trasformazioni XML. Non disponiamo di dati di test di input corretti di per sé, solo file DTD o XSD. Vorremmo generare noi stessi i nostri dati di test da questi file. C'è un modo semplice / gratuito per farlo?

modificare

Apparentemente non ci sono strumenti gratuiti per questo, e sono d'accordo che OxygenXML è uno dei migliori strumenti per questo.


8
Non riesco a vedere le risposte a queste domande che non si adattano al formato Domande e risposte, o sollecitodebate, arguments, polling, or extended discussion
mjn

Risposte:


29

Penso che lo faccia anche Oxygen ( http://www.oxygenxml.com/ ), ma questo è un altro prodotto commerciale. È bello, però ... lo consiglio vivamente a chiunque faccia molto lavoro XML. Viene anche in un bel plugin Eclipse.

Credo che ci sia una prova gratuita di 30 giorni completa di tutte le funzionalità.


Ho un sacco di XSD che a loro volta eredita schemi da diversi XSD e ho bisogno di generare un file XML a scopo di test da questo XSD, sto usando ossigenoXML per fare questo, ma quando provo a farlo, non funziona per me e dice che si prega di definire il nodo radice ma che non mi consente di farlo. Quindi, se qualcuno avesse lavorato con ossigenoXML, suggerirebbe cosa potrebbe essere in giro per questo?
Rachel,

Grazie leveland. Anche questo ha risposto alla mia domanda! Se desideri venire a rispondere alla mia domanda: stackoverflow.com/questions/7041388/… , sarei più che felice di contrassegnare la tua come risposta.
Eric H,

179

In Visual Studio 2008 SP1 e versioni successive, XML Schema Explorer può creare un documento XML con alcuni dati di esempio di base:

  1. Apri il tuo documento XSD
  2. Passa a XML Schema Explorer
  3. Fai clic con il pulsante destro del mouse sul nodo principale e scegli "Genera XML di esempio"

Schermata di XML Schema Explorer


15
sì, questo è il modo più semplice. Apri XSD, passa a XML Schema Explorer, seleziona il nodo principale, fai clic con il pulsante destro del mouse e scegli "Genera XML di esempio".
balint,

+1 Grazie @Sam Warwick e @balint. Questo è stato davvero utile!
jessegavin,

3
L'ho usato con VS2008, ma non riesco a trovarlo in VS2010. Qualcuno può confermare che questo esiste ancora?
Simon,

Come Simon: non riesco a trovarlo neanche in VS2010. Secondo MSDN, dovrebbe essere ancora lì, ma non verrà visualizzato da nessuna parte nell'interfaccia utente ... :-(
Martijn

6
@Simon: ottieni "Genera XML di esempio" solo quando fai clic con il pulsante destro del mouse su uno degli elementi in Esplora schemi. Gli elementi sono rappresentati graficamente tramite le parentesi quadre verdi a sinistra / a destra: "<>". Probabilmente stai facendo clic con il pulsante destro del mouse su un tipo e il messaggio generate lo genererà solo per gli elementi (il che ha senso).
Miguel Sevilla,

126

Nelle versioni recenti dell'IDE Eclipse gratuito e open source è possibile generare documenti XML da file DTD e XSD. Fai clic con il pulsante destro del mouse su un determinato file * .dtd o * .xsd e seleziona "Genera -> File XML ...". È possibile scegliere quale elemento radice generare e se devono essere generati attributi ed elementi opzionali.

Ovviamente puoi usare Eclipse per creare e modificare anche i tuoi file di schema DTD e XSD. E non è necessario installare alcun plug-in. È incluso nella distribuzione standard.


Grazie! Eclipse è gratuito e questa è stata la soluzione perfetta.
Akku,

Ragazzi, sapete quale funzionalità Eclipse offre questa funzionalità? Il mio sottomenu "Genera" ha "Classi JAXB" come unico elemento.
otto.poellath,

9
È necessario installare il progetto Strumenti Web (consultare Aiuto-> Installa nuovo software) per ottenere queste opzioni.
pwaring

3
Eclipse sembra una buona opzione, ma non sono riuscito a convincere la generazione a seguire gli XSD importati. Ad esempio, se avessi un XSD che descriva 3 elementi e uno di questi fosse un tipo ComplexType definito in un XSD referenziato / importato, non genererebbe per quell'elemento. Qualche idea?
David Hergert,

@DavidHergert Una semplice soluzione alternativa sarebbe la generazione di un tipo di stub.
Adam Matan,

32

Per gli utenti di Intellij Idea:

Dai un'occhiata a Strumenti -> Azioni XML

inserisci qui la descrizione dell'immagine

Sembra funzionare molto bene (per quanto ho testato).

Modificare:

Come accennato da @naXa, ora puoi anche fare clic con il pulsante destro del mouse sul file XSD e fare clic su "Genera documento XML dallo schema XSD ..."


c'è un modo per specificare # di elementi da generare (per le sequenze)?
Nikita

Ho testato ogni soluzione di questo thread e questo ha funzionato al meglio
FLX,

1
Non funziona per me nell'ultimo RubyMine (v. 7.0, basato su Intellij Idea) con XSD con molte importazioni. Non ho altro che un messaggio di errore.
Envek,

3
"Errore di compilazione dello schema"?
The Red Pea,

1
Nelle versioni più recenti, fai clic con il pulsante destro del mouse su XSD e seleziona "Genera documento XML dallo schema XSD ..."
naXa,

12

Il camprocessore disponibile su Sourceforge.net eseguirà la generazione di casi di test xml per qualsiasi XSD. È disponibile un tutorial per mostrare come generare i propri esempi di test, incluso l'uso di suggerimenti sul contenuto per garantire esempi realistici, non solo quelli casuali.

Il tutorial è disponibile qui: http://www.oasis-open.org/committees/download.php/29661/XSD%20and%20jCAM%20tutorial.pdf

E ulteriori informazioni sullo strumento, che utilizza lo standard OASIS Content Assembly Mechanism (CAM) per trasformare il tuo XSD in una struttura più compatibile con XSLT, sono disponibili sul sito Web delle risorse: http://www.jcam.org.uk

Divertiti, DW


3
Il collegamento diretto al download di Sourceforge.net è: sourceforge.net/projects/camprocessor

@Pyderman - ecco le tue impostazioni - cerca come cambiarle.
Ghoti,

10

È possibile utilizzare il generatore di istanze XML che fa parte del validatore multi-schema Sun / Oracle .

È README.txt afferma:

Sun XML Generator è uno strumento Java per generare varie istanze XML da diversi tipi di schemi. Supporta DTD, RELAX Namespace, RELAX Core, TREX e un sottoinsieme di W3C XML Schema Part 1. [...]

Questo è uno strumento da riga di comando che può generare istanze valide e non valide dagli schemi. Può essere utilizzato per generare casi di test per applicazioni XML che devono essere conformi a un particolare schema.

Scaricare e decomprimere xmlgen.zipdalla pagina di download di msv ed eseguire il comando seguente per ottenere istruzioni dettagliate sull'uso:

java -jar xmlgen.jar -help

Lo strumento sembra essere rilasciato con una licenza BSD; il codice sorgente è accessibile da qui


Molto bella! Un po 'limitato però. L'ho provato su un XSD che importa altri XSD e non è riuscito. Ma su un DTD funziona molto bene. Grazie!
Lindelof

1
Link attuali: homepage , download . xmlgen.zipsolo nella nigthlydirectory. Confermo l'impossibilità di generare un campione dal mio xsd.
Jarekczek,

Nel mio caso, è necessario utilizzare il --examplefile per contenere token che possono essere utilizzati per generare un nuovo file di esempio. Ci vuole un campione per fare un campione! Non facile ...
The Red Pea,

i collegamenti java.net sono praticamente morti.
RedGrittyBrick,

10

XMLSpy lo fa per te, anche se non è gratuito ...

Credo che Liquid Xml Studio lo faccia per te ed è gratuito, ma non l'ho usato personalmente per creare dati di test.


Genera qualcosa, ma non hai molto controllo su di esso: puoi scegliere l'elemento toplevel e alcune opzioni generali, ma non puoi usare XMLSpy per generare un set di test case con molte varianti ecc.
Hans-Peter Störr

XMLSpy sembrava buono ma ha generato xml che non è riuscito a convalidare rispetto alla xsd utilizzata per generarlo. Fallire. Ha anche sparato su un postiveintegercampo - inserendo *ERROR*invece
Tim Abell il

7

Sembra che nessuno sia stato in grado di rispondere alla domanda finora :)

Uso MOXy di EclipseLink per generare dinamicamente classi di associazione e poi ricorsivamente attraverso i tipi associati. È un po 'pesante, ma consente l'iniezione del valore XPath una volta istanziata la struttura ad albero degli oggetti:

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 è un metodo ricorsivo piuttosto semplice:

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");
        }
    }

Convertire tutto in XML è abbastanza semplice:

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

7

Puoi anche utilizzare XMLPad (gratuito da usare) disponibile qui http://www.wmhelp.com per generare i tuoi esempi xml. Dal menu: XSD -> genera un file XML di esempio.


Ottengo un overflow dello stack o "WMHelp XmlPad ha smesso di funzionare" quando scelgo "Genera dati di esempio"
The Red Pea

5

Microsoft ha pubblicato uno strumento "generatore di documenti" come esempio. Questo è un articolo che descrive in dettaglio l'architettura e il funzionamento dell'app di esempio.

Se desideri solo eseguire lo strumento di generazione del campione, fai clic qui e installa MSI.

È gratis. La fonte è disponibile Richiede .NET Framework per funzionare. Funziona solo con XSD. (non Relax NG o DTD).


Il link sopra è un articolo su MSDN chiamato "Generazione di documenti XML da schemi XML"
Sam Warwick,

Il programma di installazione rilascia un sacco di codice C # sul tuo computer. Basta scaricarli in LinqPad e avrai il tuo generatore di istanze XML gratuito. Ta dah!
Sean Kearon,

9 anni dopo, funziona ancora alla grande per gli XSD.
Mikanikal,


4

Microsoft Office ha " InfoPath ", che accetta un XSD come importazione e consente di definire rapidamente e facilmente un editor basato su moduli per la creazione di file XML. Ha due modalità: una in cui si definisce il modulo e un'altra in cui si crea il file XML compilando il modulo. Credo che sia arrivato per la prima volta con Office 2003 e la maggior parte delle persone non lo installa mai. Mi sorprende da quanto mi piace.


1

XMLBlueprint 7.5 può effettuare le seguenti operazioni: - generare xml di esempio da dtd - generare xml di esempio dallo schema relax - generare xml di esempio dallo schema xml


1

La versione open source di SoapUI può generare richieste SOAP da WSDL (che contiene definizioni di tipo XSD), quindi sembra che ci sia un'implementazione open source di questa funzionalità. Sfortunatamente, non ho capito a quale libreria è abituato.


1

Liquid XML Studio ha una procedura guidata XML Sample Generator che costruirà file XML di esempio da uno schema XML. I dati risultanti sembrano conformi allo schema (semplicemente non possono generare dati per i modelli regex).

Generare un campione XML da un XSD


0

La libreria OpenXSD menziona il supporto per la generazione di istanze XML basate su XSD. Controlla quello.


puoi per favore pubblicare un esempio di utilizzo?
naXa,



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.