Wie generiere ich XML-Beispieldokumente aus ihrer DTD oder XSD?

186

Wir entwickeln eine Anwendung, die eine erhebliche Anzahl von XML-Transformationen umfasst. Wir haben per se keine richtigen Eingabetestdaten, nur DTD- oder XSD-Dateien. Aus diesen Dateien möchten wir unsere Testdaten selbst generieren. Gibt es eine einfache / kostenlose Möglichkeit, dies zu tun?

Bearbeiten

Es gibt anscheinend keine kostenlosen Tools dafür, und ich stimme zu, dass OxygenXML eines der besten Tools dafür ist.

Lindelof
quelle
8
Ich sehe keine Antworten auf diese Fragen, die nicht zum Q & A-Format passen, oder debate, arguments, polling, or extended discussion
fordere

Antworten:

29

Ich denke, Oxygen ( http://www.oxygenxml.com/ ) macht das auch, aber das ist ein anderes kommerzielles Produkt. Es ist jedoch eine schöne Sache ... Ich würde es jedem empfehlen, der viel XML-Arbeit leistet. Es kommt auch in einem schönen Eclipse-Plugin.

Ich glaube, es gibt eine kostenlose 30-Tage-Testversion mit vollem Funktionsumfang.

Levand
quelle
Ich habe eine Reihe von XSDs, die wiederum Schemas von verschiedenen XSDs erben, und ich muss zu Testzwecken eine XML-Datei aus dieser XSD generieren. Ich verwende OxygenXML, um dies zu tun, aber wenn ich es versuche, funktioniert es nicht für mich und Es heißt, bitte definieren Sie den Wurzelknoten, aber dann kann ich das nicht. Wenn also jemand mit OxygenXML gearbeitet hätte, schlagen Sie vor, wie das umgehen könnte?
Rachel
Danke Level und. Dies beantwortete auch meine Frage! Wenn Sie meine Frage beantworten möchten : stackoverflow.com/questions/7041388/… , würde ich Ihre gerne als Antwort markieren.
Eric H
179

In Visual Studio 2008 SP1 und höher kann der XML-Schema-Explorer ein XML-Dokument mit einigen grundlegenden Beispieldaten erstellen:

  1. Öffnen Sie Ihr XSD-Dokument
  2. Wechseln Sie zum XML-Schema-Explorer
  3. Klicken Sie mit der rechten Maustaste auf den Stammknoten und wählen Sie "Beispiel-XML generieren".

Screenshot des XML-Schema-Explorers

Sam Warwick
quelle
15
Ja, das ist der einfachste Weg. Öffnen Sie XSD, wechseln Sie zum XML-Schema-Explorer, wählen Sie den Stammknoten aus, klicken Sie mit der rechten Maustaste und wählen Sie "Beispiel-XML generieren".
Balint
+1 Danke @Sam Warwick und @balint. Das war wirklich hilfreich!
Jessegavin
3
Ich habe dies mit VS2008 verwendet, aber ich kann dies in VS2010 nicht finden. Kann jemand bestätigen, dass dies noch existiert?
Simon
Gleich wie Simon: Ich kann das auch in VS2010 nicht finden. Laut MSDN sollte es immer noch da sein, aber es wird nirgendwo in der Benutzeroberfläche angezeigt ... :-(
Martijn
6
@Simon: Sie erhalten das "Beispiel-XML generieren" nur, wenn Sie mit der rechten Maustaste auf eines der Elemente im Schema-Explorer klicken. Elemente werden grafisch über die grünen linken / rechten spitzen Klammern dargestellt: "<>". Sie klicken wahrscheinlich mit der rechten Maustaste auf einen Typ, und die Nachricht zum Generieren generiert sie nur für Elemente (was sinnvoll ist).
Miguel Sevilla
126

In neueren Versionen der kostenlosen und Open-Source- Eclipse- IDE können Sie XML-Dokumente aus DTD- und XSD-Dateien generieren. Klicken Sie mit der rechten Maustaste auf eine bestimmte * .dtd- oder * .xsd-Datei und wählen Sie "Generieren -> XML-Datei ...". Sie können auswählen, welches Stammelement generiert werden soll und ob optionale Attribute und Elemente generiert werden sollen.

Natürlich können Sie mit Eclipse auch Ihre DTD- und XSD-Schemadateien erstellen und bearbeiten. Und Sie müssen keine Plugins installieren. Es ist in der Standardverteilung enthalten.

Florian Fankhauser
quelle
Vielen Dank! Eclipse ist kostenlos und dies war die perfekte Lösung.
Akku
Wissen Sie zufällig, welche Eclipse-Funktion diese Funktionalität bietet? Mein Untermenü "Generieren" enthält als einziges Element "JAXB-Klassen".
otto.poellath
9
Sie müssen das Web Tools-Projekt installieren (siehe Hilfe-> Neue Software installieren), um diese Optionen zu erhalten.
Pwaring
3
Eclipse scheint eine gute Option zu sein, aber ich konnte die Generation nicht dazu bringen, importierten XSDs zu folgen. Wenn ich beispielsweise eine XSD hätte, die 3 Elemente beschreibt, und eine davon ein complexType wäre, der in einer referenzierten / importierten XSD definiert wurde, würde sie für dieses Element nicht generiert. Irgendwelche Ideen?
David Hergert
@DavidHergert Eine einfache Problemumgehung wäre das Generieren eines Stub-Typs.
Adam Matan
32

Für Benutzer von Intellij Idea:

Schauen Sie sich Tools -> XML-Aktionen an

Geben Sie hier die Bildbeschreibung ein

Scheint sehr gut zu funktionieren (soweit ich getestet habe).

Bearbeiten:

Wie von @naXa erwähnt, können Sie jetzt auch mit der rechten Maustaste auf die XSD-Datei klicken und auf "XML-Dokument aus XSD-Schema generieren ..." klicken.

Yamass
quelle
Gibt es eine Möglichkeit, die Anzahl der zu generierenden Elemente (für Sequenzen) anzugeben?
Nikita
Ich habe jede Lösung dieses Threads getestet und dies hat am besten funktioniert
FLX
1
Funktioniert bei mir nicht in der neuesten RubyMine (Version 7.0, Intellij Idea-basiert) mit XSD mit vielen Importen. Ich habe nur eine Fehlermeldung.
Envek
3
"Schema-Kompilierungsfehler"?
Die rote Erbse
1
Klicken Sie in neueren Versionen mit der rechten Maustaste auf XSD und wählen Sie "XML-Dokument aus XSD-Schema generieren ..."
naXa
12

Der auf Sourceforge.net verfügbare Camprozessor generiert XML-Testfälle für jede XSD. Es gibt ein Tutorial, das Ihnen zeigt, wie Sie Ihre eigenen Testbeispiele erstellen können - einschließlich der Verwendung von Inhaltshinweisen, um realistische Beispiele zu gewährleisten, nicht nur zufällige Junk-Beispiele.

Das Tutorial finden Sie hier: http://www.oasis-open.org/committees/download.php/29661/XSD%20and%20jCAM%20tutorial.pdf

Weitere Informationen zu dem Tool, das den CAS-Standard (OASIS Content Assembly Mechanism) verwendet, um Ihre XSD in eine XSLT-freundlichere Struktur umzuwandeln, finden Sie auf der Ressourcen-Website unter http://www.jcam.org.uk

Viel Spaß, DW


quelle
3
Direkter Link zum Download von Sourceforge.net ist: sourceforge.net/projects/camprocessor
@Pyderman - das sind Ihre Einstellungen - schauen Sie nach, wie Sie sie ändern können.
Ghoti
10

Sie können den XML-Instanzgenerator verwenden, der Teil des Sun / Oracle Multi-Schema Validator ist .

Es heißt README.txt:

Sun XML Generator ist ein Java-Tool zum Generieren verschiedener XML-Instanzen aus verschiedenen Arten von Schemas. Es unterstützt DTD, RELAX Namespace, RELAX Core, TREX und eine Teilmenge des W3C XML-Schemas Teil 1. [...]

Dies ist ein Befehlszeilentool, das sowohl gültige als auch ungültige Instanzen aus Schemas generieren kann. Es kann zum Generieren von Testfällen für XML-Anwendungen verwendet werden, die einem bestimmten Schema entsprechen müssen.

Laden Sie xmlgen.zipdie MSV-Download-Seite herunter, entpacken Sie sie und führen Sie den folgenden Befehl aus, um detaillierte Anweisungen zur Verwendung zu erhalten:

java -jar xmlgen.jar -help

Das Tool scheint unter einer BSD-Lizenz veröffentlicht zu sein. Der Quellcode ist von hier aus zugänglich

falko
quelle
Sehr schön! Ein bisschen begrenzt. Ich habe es auf einer XSD versucht, die andere XSD importiert, und es ist fehlgeschlagen. Aber auf einer DTD funktioniert es sehr gut. Vielen Dank!
Lindelof
1
Aktuelle Links: Homepage , Downloads . xmlgen.zipnur im nigthlyVerzeichnis. Ich bestätige die Unfähigkeit, ein Beispiel aus meinem xsd zu generieren.
Jarekczek
In meinem Fall musste die --exampleDatei verwendet werden, um Token zu enthalten, mit denen eine neue Beispieldatei generiert werden kann. Es braucht eine Probe, um eine Probe zu machen! Nicht einfach ...
Die rote Erbse
java.net-Links sind grundsätzlich tot.
RedGrittyBrick
10

XMLSpy erledigt das für Sie, obwohl das nicht kostenlos ist ...

Ich glaube, dass Liquid Xml Studio dies für Sie erledigt und kostenlos ist, aber ich habe es nicht persönlich zum Erstellen von Testdaten verwendet.

SCdF
quelle
Es generiert etwas, aber Sie haben nicht viel Kontrolle darüber: Sie können das Element der obersten Ebene und einige allgemeine Optionen auswählen, aber Sie können XMLSpy nicht verwenden, um eine Reihe von Testfällen mit vielen Varianten usw. zu generieren.
Hans-Peter Störr
XMLSpy sah gut aus, generierte jedoch XML, das dann nicht anhand der xsd validiert werden konnte, mit der es generiert wurde. Scheitern. Es barfed auch auf einem postiveintegerFeld - *ERROR*stattdessen setzen
Tim Abell
7

Anscheinend konnte bisher niemand die Frage beantworten :)

Ich verwende MOXy von EclipseLink, um Bindungsklassen dynamisch zu generieren und dann die gebundenen Typen rekursiv durchzugehen. Es ist etwas schwer, ermöglicht jedoch die Injektion von XPath-Werten, sobald der Objektbaum instanziiert ist:

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 ist eine ziemlich einfache rekursive Methode:

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

Alles in XML zu konvertieren ist ziemlich einfach:

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

Sie können auch XMLPad (kostenlos) verwenden, das Sie hier finden: http://www.wmhelp.com , um Ihre XML-Beispiele zu generieren. Aus dem Menü: XSD -> Beispiel-XML-Datei generieren.

Pat B.
quelle
Ich bekomme einen Stapelüberlauf oder "WMHelp XmlPad funktioniert nicht mehr", wenn ich "Beispieldaten generieren"
The Red Pea
5

Microsoft hat als Beispiel ein "Dokumentgenerator" -Tool veröffentlicht. Dies ist ein Artikel , der die Architektur und den Betrieb der Beispiel-App ausführlich beschreibt.

Wenn Sie nur das Beispielgenerierungstool ausführen möchten, klicken Sie hier und installieren Sie das MSI.

Es ist kostenlos. Die Quelle ist verfügbar. Erfordert die Ausführung von .NET Framework. Funktioniert nur mit XSDs. (nicht Relax NG oder DTD).

Cheeso
quelle
Der obige Link führt zu einem Artikel über MSDN mit dem Titel "Generieren von XML-Dokumenten aus XML-Schemas"
Sam Warwick,
Das Installationsprogramm legt eine Menge C # -Code auf Ihrem Computer ab. Speichern Sie diese einfach in LinqPad und Sie haben Ihren kostenlosen XML-Instanzgenerator. TA Dah!
Sean Kearon
9 Jahre später funktioniert dies immer noch hervorragend für XSDs.
Mikanikal
5

XML-XIG: XML-Instanzgenerator

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

Diese OpenSource wäre hilfreich.

rolandpeng
quelle
1
Nicht sehr benutzerfreundlich. Wirft viele Ausnahmen, kann es nicht zum Funktionieren bringen, nachdem es ungeklärt ist NullPointerException.
Jarekczek
4

Microsoft Office verfügt über ' InfoPath ', das eine XSD als Import verwendet und es Ihnen ermöglicht, schnell und einfach einen formularbasierten Editor zum Erstellen von XML-Dateien zu definieren. Es gibt zwei Modi: einen, in dem Sie das Formular definieren, und einen anderen, in dem Sie die XML-Datei durch Ausfüllen des Formulars erstellen. Ich glaube, es kam zuerst mit Office 2003 und die meisten Leute installieren es nie. Es schockiert mich, wie sehr ich es mag.

Kieveli
quelle
1

XMLBlueprint 7.5 kann Folgendes tun: - Beispiel-XML aus dtd generieren - Beispiel-XML aus dem Relax-ng-Schema generieren - Beispiel-XML aus XML-Schema generieren

Peter
quelle
1

Die Open-Source-Version von SoapUI kann SOAP-Anforderungen aus WSDL (die XSD-Typdefinitionen enthält) generieren. Es sieht also so aus, als ob es eine Open-Source-Implementierung dieser Funktionalität gibt. Leider habe ich nicht herausgefunden, welche Bibliothek daran gewöhnt ist.

otto.poellath
quelle
1

Liquid XML Studio verfügt über einen XML-Beispielgenerator- Assistenten, der Beispiel-XML-Dateien aus einem XML-Schema erstellt. Die resultierenden Daten scheinen mit dem Schema übereinzustimmen (es können einfach keine Daten für Regex-Muster generiert werden).

Generieren Sie ein XML-Beispiel aus einer XSD

Sprotty
quelle
0

In der OpenXSD- Bibliothek wird erwähnt, dass sie das Generieren von XML-Instanzen basierend auf XSD unterstützen. Schau dir das an.

Aravind Yarram
quelle
Kannst du bitte ein Anwendungsbeispiel posten?
NaXa
0

XML Blueprint macht das auch; Anweisungen hier

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

Es ist nicht kostenlos, aber es gibt eine 10-tägige kostenlose Testversion. es scheint schnell und effizient; Leider ist es nur Windows.

Bambax
quelle