# XML to XSD Generator



## Dog86 (5. Aug 2009)

Hallo Leute,

ich suche schon ne längere Zeit nach einem XML to XSD generator. Mir ist bewusst, dass es am Ende kein optimales XSD geben kann / wird, dennoch brauche ich die möglichkeit aus einer xml datei eine XSD zu erstellen.

Ich habe jetzt etwas im Netzt gesucht, aber keine API oder ähnliches gefunden um soetwas zu bewerkstelligen. Daher mal die Frage an euch.

Kenn jmd. ein Beispiel oder gar eine lib die soetwas zur verfügung stellt? Oder hat sogar jmd. von euch mal soetwas gemacht?

Wenn nicht, wie kann man denn soetwas angehen? Wie kann ich sowas selbst machen wenn es sowas noch nicht gibt?

Bin über jede Hilfe dankbar.


----------



## Spacerat (5. Aug 2009)

Der richtige Google-Suchbegriff (XML2XSD) führt z.B. dort hin:
Trang


----------



## Dog86 (5. Aug 2009)

Ja danke, das scheint ja schonmal was zu sein.

Doch leider bin ich nicht so der programmierfreak in java. Und eine API Seite dazu habe ich auch nicht gefunden.

ich hab jetzt mal die jar in mein projekt eingebunden..wie kann ich da jetzt via code eine xml transformieren in eine xsd? Sry aber ich hab da jetzt schon echt probiert und gesucht aber nichts gefunden. Wäre jmd. so nett und könnte mir sagen wie der code dazu aussehen könnte? 

Wäre echt nett.


----------



## Spacerat (5. Aug 2009)

Naja... dann hast du ja offensichtlich das Zip-Archiv gefunden. In diesem befindet sich auch die Dokumenation (trang-manual.html) und der Quellcode (im src Verzeichnis). Ist zwar alles in englisch, aber reicht das nicht als API?


----------



## Dog86 (5. Aug 2009)

Leider bin ich nicht so wirklich fit in sachen java programmierung...was bedeutet, dass ich wohl ewig suchen und schauen werde und es dann aber sicherlich nicht hinbekomme. Daher frage ich ja euch, erfahrene Programmierer ob ihr da mir nicht etwas unter die Arme greifen könnt.

Ich will jetzt nicht da stehen wie jmd. der nichts tut und die arbeit euch überlässt...aber ich bekomme es wirklich einfach nicht hin, brauche es aber recht dringend. 

Na ja, ich schau da jetzt noch weiter rein, wäre aber schön wenn mich da noch jmd. von euch unterstützen könnte.


----------



## Dog86 (6. Aug 2009)

So ich mal wieder..ich hab mich da jetzt versucht in alles einzulesen, leider aber ohne Erfolg. Ich bin nicht wirklich weiter gekommen. Kann mir jmd. kurz aushelfen?


----------



## Spacerat (6. Aug 2009)

...gut, Dannsimmermalnetso 
Man kann die Arbeitsweise des Paketes recht simpel nachvollziehen. Die Main-Methode befindet sich in der Klasse 
	
	
	
	





```
com.thaiopensource.relaxng.translate.Driver
```
 Diese muss ein wenig analysiert werden, um darauf zu kommen, dass man innerhalb eigener Anwendungen diverse Input- und OutputFormate hat. Für dich  dürfte 
	
	
	
	





```
com.thaiopensource.relaxng.input.xml.XmlInputFormat
```
 als Input- und 
	
	
	
	





```
com.thaiopensource.relaxng.output.xsd.XsdOutputFormat
```
 als OutputFormat interessant sein.
@Edit: Wundere dich nicht über die schnelle Antwort. Ich hatte schon vor deinem letzten Beitrag beschlossen, dir auf die Sprünge zu helfen.


----------



## Dog86 (6. Aug 2009)

Super, danke schonmal!!!

Ich hab nun folgenden Code da rein gemacht... doch irgendwie haut das immernoch nicht hin. Ich check da die ganzen parameter auch nicht so richtig.. 

```
XsdOutputFormat output = new XsdOutputFormat();
            		String[] params = {"C:\\test.xml"};
            		SchemaCollection schema = new SchemaCollection();
   
            		OutputDirectory out = new OutputDirectory() {
						
						public void setIndent(int indent) {
							// TODO Auto-generated method stub
							
						}
						
						public void setEncoding(String encoding) {
							// TODO Auto-generated method stub
							
						}
						
						public String reference(String fromSourceUri, String toSourceUri) {
							// TODO Auto-generated method stub
							return null;
						}
						
						public Stream open(String sourceUri, String encoding) throws IOException {
							// TODO Auto-generated method stub
							return null;
						}
						
						public String getLineSeparator() {
							// TODO Auto-generated method stub
							return null;
						}
						
						public int getLineLength() {
							// TODO Auto-generated method stub
							return 0;
						}
						
						public int getIndent() {
							// TODO Auto-generated method stub
							return 0;
						}
					};
            		try {
						output.output(schema, out, params, "xml", null);
					} catch (SAXException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (OutputFailedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (InvalidParamsException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
```


----------



## Spacerat (6. Aug 2009)

Die Klasse OutputDirectory ist lediglich ein Interface. Deswegen kann man es nicht bzw. nur anonym (wie in deinem Beispiel) instanzieren. Es gibt aber z.B. noch die konkrete Klasse "LocalOutputDirectory" welche dieses Interface implementiert. In Java kann man nun Folgendes schreiben:
	
	
	
	





```
OutputDirectory outdir = new LocalOutputDirectory(mainuri, mainfile,
                          extension, DEFAULT_OUTPUT_ENCODING,
                          DEFAULT_LINE_LENGTH, DEFAULT_INDENT);
```
versuch' mal, nach zu vollziehen, wie es in der Klasse Driver gemacht wird. Der Quellcode ist ja im Archiv "src" dabei. Sonst wird's echt müssig, dir auch noch die ganzen Java-Grundlagen bei zu biegen.


----------



## Dog86 (6. Aug 2009)

Hmm, also irgendwie bekomme ich das einfach nicht hin. Ja du hast natürlich recht, mir fehlt es da ein wenig am verständnis von Java 

Meinst du, du könntest mir da ein Beispiel code erstellen der mit der API eine XML in eine XSD umwandelt. XML liegt auf dem filesystem und xsd soll da auch entsprechend abgelegt werden.

Wäre echt nett von dir, denn ich blicke da überhaupt nicht durch...


```
ErrorHandlerImpl eh = new ErrorHandlerImpl();
            		SchemaCollection sc = ((MultiInputFormat)inFormat).load(uris, inputParamArray, "xsd", eh);
            		OutputFormat of = new XsdOutputFormat();
            		of.output(sc, od, outputParams.toArray(new String[0]), inputType.toLowerCase(), eh);
```

Ich weiß nur nicht so recht was ich bei den Paramteren zum Beispiel eingeben muss..

Ich bekomme komischerweise auch immer fehlermeldungen mit ClassDefinitionNotFound... sehr seltsam..compilen kann ich aber alles ohne probleme


----------



## Dog86 (6. Aug 2009)

Gott bin ich dumm!!!! /o\

Also die Driver Klasse ist die, die dafür verantwortlich ist, dass da convertiert wird..

Jetzt habe ich einfach mal zum testen Driver.main("test.xml","test.xsd"); eingegeben und tada es geht! Leider beendet er mir das programm dann, da in der main ein exit drin ist.

Also habe ich mir die methode domain, die leider privat ist und kopiert in meine klasse. Nun kann ich das einfach so konvertieren!! JUHU.

Danke, danke, danke Spacerat ohne deine Hilfe wäre ich da nie drauf gekommen. Auch wenn es nun im nachhinein leicht erscheint, war das gar nicht so einfach für mich. Danke! Hoffe ich habe deine Nerven nciht all zu sehr strapaziert.


----------



## Spacerat (6. Aug 2009)

... herzlichen Glückwunsch...
Aber wieso noch die doMain() kopieren, wenn
	
	
	
	





```
Driver.main(new String[] {"test.xml", "test.xsd"});
```
in der gesamten Anwendung funktioniert?
@Edit: ... na gut... überredet... Der 1. Satz in deinem letzten Thread trifft dann wohl auf uns beide zu... was soll's... nichts für unklug.


----------



## ARadauer (6. Aug 2009)

zum Thema XML to XSD Generator ... oxygen kann das auch... 

ist aber nicht kostenlos ;-)


----------



## Rike (22. Sep 2011)

Hier noch eine Online-Alternative, ist recht einfach und kostenlos 
XML-2-XSD | XML2XSD | Convert Xml to XSD (Schema Definition)


----------

