# Validierung nur beim einlesen oder auch beim schreiben?



## BlubBlub (13. Sep 2011)

Hi ich habe eine externe DTD erstellt.
Nun lese ich eine XML file ein die auf diese DTD verweist.
Mit dem folgenden Code kann ich beim Einlesen überprüfen, ob das XML File
valide ist.


```
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		builderFactory.setValidating(true);
                DocumentBuilder builder = builderFactory.newDocumentBuilder();
		Document doc = builder.parse(new FileInputStream(filename));
```

Nun kann ich mit meinem Programm auch Dateien in XML Form abspeichern.
Beim Abspeichern gebe ich folgendes vor:


```
....
....
 document.createElement("position"); //Erzeugung eines XML documents
...
...

TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING,"ISO-8859-1");
transformer.setOutputProperty(OutputKeys.STANDALONE, "no");
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,"C:/Users/.../graphicAnimator.dtd");
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
```

Jetzt frage ich mich grad ob bei der programmatischen Erzeugung hierbei gegen die DTD geprüft wird. Wird damit sichergestellt, dass das programmatisch erzeugte XML Dokument den Regeln der vorgegeben DTD folgt?

Und wenn nicht wie kann ich sicherstellen, dass eine von mir erzeugte XML Datei einer von mir wie oben vorgegeben DTD folgen soll. Falls die erzeugte XML Datei nicht den Regeln der DTD folgt möchte in irgendeiner Form darüber informiert werden.


----------



## Wildcard (13. Sep 2011)

Ich lasse mich gerne korrigieren, aber ich glaube es gibt keine Ausgangsseitige Validierung und du musst das Dokument erst wieder parsen.
Alternativ kann ich dir EMF empfehlen, dazu müsstest du aber die DTD in ein Schema umwandeln (wer verwendet denn noch DTDs? ). Mit EMF kannst du dir aus dem Schema Java Klassen generieren und dann automatisch XML Instanzen in einen Objektgraph überführen. Die Constraints des Schemas werden dann soweit wie Möglich im generierten Java Code umgesetzt und die Objekte können dann automatisch validiert werden bevor du wieder als XML abspeicherst.


----------



## BlubBlub (18. Sep 2011)

Hmm das klingt ja recht interessant.

Ich weiß nicht ob ich dich grad richtig verstehe. Ist es also möglich Objekte automatisch in XML Code generieren zu lassen und aus XML Code auch wieder Objekte generieren zu lassen?
Zudem wie zuverlässig ist diese Objekterzeugung?

Zu der Frage: Wer verwendet schon DTDs? Ich würde mal sagen Anfänger, die bisher irgendwie versuchen in das XML zeugs einzusteigen ^^. Gibt ja irgendwie tausend Mögichkeiten wie man etwas abspeichern und einlesen kann, für irgendwas muss man sich da ja entscheiden^^. Und da dachte ich zu Anfang wäre es am besten sich mit den Basics auseinadnerzusetzen


----------



## Marcinek (18. Sep 2011)

Ja man kann Objekte zu XML serialisieren. Dafür gibt es unzählige Frameworks. 

XStream benutze ich und finde es klasse ;D

Gruß,

Martin


----------



## Wildcard (18. Sep 2011)

> Zudem wie zuverlässig ist diese Objekterzeugung?


Wenn das kein zuverlässiger und deterministischer Prozess wäre, würde es niemand benutzen, oder? 




> Zu der Frage: Wer verwendet schon DTDs? Ich würde mal sagen Anfänger, die bisher irgendwie versuchen in das XML zeugs einzusteigen


DTDs sind veraltet. XML wird üblicherweise mit XML Schema Definition (XSD) beschrieben.


----------

