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.


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.


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


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.


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.


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


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


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.


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

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.


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).


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


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.


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


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.


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


0

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


Kannst du bitte ein Anwendungsbeispiel posten?
NaXa



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.