# XML Datei validieren



## leni (20. Sep 2006)

Hallo!

Ich habe mir eine XML-Datei gebastelt und ein passendes Schema dazu, jetzt möchte ich die XML-Datei in einem kleinen Java-Programm mit Hilfe des XML-Schemas validieren und dann die XML-Datei wieder je nachdem ob die Validierung erfolgreich war in ein neue XML-Datei rausschreiben. Ich würde gerne JDom verwenden. Gibts für dieses Vorhaben eine einfache Lösung?

leni


----------



## byte (20. Sep 2006)

Guck mal auf der Seite von JDOM in die FAQ, da steht wie die Validierung funktioniert. Oder suche hier im Forum, das Thema wurde schon ein paar mal behandelt.


----------



## leni (20. Sep 2006)

ah danke für die Antwort, habe mich auf der JDom Seite umgesehen und würde die Validierung jetzt folgendermaßen machen:


```
File xml = new File("books.xml"); 
SAXBuilder builder =
  new SAXBuilder("org.apache.xerces.parsers.SAXParser", true);
builder.setFeature(
  "http://apache.org/xml/features/validation/schema", true);
builder.setProperty(
  "http://apache.org/xml/properties/schema/external-schemaLocation",
  "http://www.w3.org/2001/12/soap-envelope soap-envelope.xsd" + " " +
  "http://kevinj.develop.com/weblog/weblog.xsd weblog.xsd");
Document doc = builder.build(xml);
```

Ist das so korrekt? - nur wo gebe ich mein Schema an, gegen das ich die XML-Datei validieren möchte? - (Mein Schema liegt auf C:\books.xsd).

Ist es auch möglich je nachdem ob die Validierung erfolgreich war, die validierte XML-Datei bei Erfolg in eine neue XML-Datei zu schreiben bzw. bei Nichterfolg einfach eine Fehlermeldung auszugeben...?

Kannst du mir nochmal weiterhelfen?

leni


----------



## byte (20. Sep 2006)

leni hat gesagt.:
			
		

> Ist das so korrekt? - nur wo gebe ich mein Schema an, gegen das ich die XML-Datei validieren möchte? - (Mein Schema liegt auf C:\books.xsd).



Du musst die Zeile builder.setProperty(...) so verändern, dass dort auf Dein Schema verwiesen wird. Wenn Du nicht weisst wie, dann guck in diesen Thread, da habe ich die gleiche Frage erst kürzlich beantwortet.



> Ist es auch möglich je nachdem ob die Validierung erfolgreich war, die validierte XML-Datei bei Erfolg in eine neue XML-Datei zu schreiben bzw. bei Nichterfolg einfach eine Fehlermeldung auszugeben...?



Ja, das geht natürlich. Der obige Code wird ne Exception schmeissen, wenn die XML-Datei nicht valide zum Schema ist. Diese kannst Du ja catchen und eine Fehlermeldung ausgeben. Ansonsten schreibst Du die XML einfach in eine neue Datei.


----------



## leni (20. Sep 2006)

Hi,

danke für den Tipp, habe ich mir jetzt auch durchgelesen.


Ich habe jetzt folgendes Programm geschrieben:


```
public static void main(String[] args)
	{
		 
		  File xmlFile = new File("books.xml");
	      SAXBuilder builder = new SAXBuilder("org.apache.xerces.parsers.SAXParser", true);
	      
	      builder.setFeature("http://apache.org/xml/features/validation/schema", true);
	      
	      builder.setProperty("http://apache.org/xml/properties/schema/external-schemaLocation",
	                        new File("books.xsd").toURI().toString());
	            
	      try 
	      {
	    	  Document doc = builder.build(xmlFile);
	      } 
	      catch (JDOMException e) {
	         e.printStackTrace();
	      } catch (IOException e) {
	         e.printStackTrace();
	      } 

	}
```

Dieses Programm läuft auch ohne Fehler durch. Ist das so korrekt? - denn ich habe mir den 

Xerces runtergeladen, aber ich habe ihn nicht in den Classpath aufgenommen und trotzdem keinen Fehler erhalten, dass er irgendwelche Klassen nicht erkennt, verstehst du das?

Es waren nur folgende import-Anweisungen nötig:

```
import java.io.IOException;
import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
```

leni


----------



## byte (20. Sep 2006)

Bau doch mal absichtlich einen kleinen Fehler in die XML. Wenn er dann ne Exception bringt, dann weisst Du dass das Validieren funktioniert.


----------



## leni (20. Sep 2006)

jap, das funktioniert, aber ich frage mich warum ich die xercesImpl.jar nicht in den classpath geben musste, denn in der FAQ zur Validierung steht ja, dass man zuerst xerces unterladen muss und das entsprechende jar-file in den classpath geben muss..?? :? 

leni


----------

