# Validieren meines XMLs mit meiner DTD funktioniert nicht



## bambi (16. Jun 2005)

Hi,

ich gestehe, dass ich bei XML und besonders bei XML mit Java ein kompletter Anfaenger bin, aber ich habe es zumindest
hinbekommen ein Servlet zu schreiben, dass mein XML erzeugt und dann an mein HTML verschickt...
Mein Problem ist jetzt, dass beim Erzeugen aber das XML nicht nach meiner DTD validiert wird. Wenn ich also ein
falsche Element <WRONG_ELEMENT> in mein XML einfuege, sollte ich eigentlich eine DOMException bekommen, aber
das XML wird einfach erzeugt, als ob alles okay waere. Hier ist mein Code:

Erzeugtes XML vom Java-Code (siehe unten)

```
<?xml version="1.0" Encoding="UTF-8"?>
   <PERSONS>
      <WRONG_ELEMENT>test-value</WRONG_ELEMENT>
   </PERSONS>
```

Dazugehoerige DTD:

```
<?xml version="1.0"?>
<!DOCTYPE PERSONS [
    <!ELEMENT PERSON (#PCDATA)>
]>
```

*Java-Code:*

Erzeugen des Documents (Ich arbeite mit dem package org.w3c.com.*)

```
private Document createXMLDocument() {
        Document doc = null;
        try  {
	        // Find the implementation
	        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	        factory.setNamespaceAware(true);
	        factory.setValidating(true);
	        
	        DocumentBuilder builder = factory.newDocumentBuilder();
	        DOMImplementation impl = builder.getDOMImplementation();
	        
	        // Create the document
	        DocumentType cedDocType = impl.createDocumentType(
	                "PERSONS", 
	                null, 
	                "http://.../person.dtd");
	        
	        doc = impl.createDocument(null, "PERSONS", cedDocType);
        } catch (ParserConfigurationException pce) {
            System.out.println("ERROR:ParserConfigurationException caught: " + pce.getMessage());
        }
        
        return doc;
    }
```

Hinzufuegen eines neuen (hier falschen) Elements

```
private Document addPerson(Document xmlDoc, String personValue) {
        try {
	        Element root = xmlDoc.getDocumentElement();
	        
	        // create a new Node
	        Node personNode = xmlDoc.createElement("WRONG_ELEMENT");
	        root.appendChild(personNode);
	
	        Text personValueTxt = xmlDoc.createTextNode(personValue);
	        personNode.appendChild(personValueTxt);
	    } catch (Exception e) {
	        // Ja,ja... Iss' kein guter Stil - wird auch noch geaendert
	        System.out.println(" *** ERROR *** Exception caught: " + e.getMessage());
	    }
	    
	    return xmlDoc;
    }
```

Ausgabe des XML-Documents:

```
private void printXmlDocument(Document xmlDoc) {   
        try {
		    // Serialize the document onto System.out
		    TransformerFactory xformFactory = TransformerFactory.newInstance();  
		    Transformer idTransform = xformFactory.newTransformer();
		    
		    Source input = new DOMSource(xmlDoc);
		    
		    Result output = new StreamResult(System.out);
		    
		    idTransform.transform(input, output );
        } catch (TransformerConfigurationException tce) {
            System.out.println("ERROR:TransformerConfigurationException" + tce.getMessage()); 
        } catch (TransformerException te) {
            System.out.println("ERROR:TransformerException" + te.getMessage()); 
        }
    }
```

Also ich bin fuer jede Hilfe dankbar - und ja, hab auch schon hier im Forum die Suche bemueht, aber nicht das
Richtige gefunden...

Danke schon mal
~B


----------



## Bleiglanz (17. Jun 2005)

Gibt es überhaupt eine DOM Implementierung, die schon beim Zusammenbau bei jedem schritt das ganze Dokument validieren würde?


----------



## bambi (17. Jun 2005)

Mhhh, dann hab' ich die API irgendwie wohl falsch verstanden, sorry. Ist das erste Mal, dass ich was mit XML mache...

Aber kannst Du mir dann ein Beispiel/Link geben, wie ich das Document validieren kann? Bin echt voellig ratlos und
hab' bisher noch nicht das Richtige gefunden... Bisher waren es immer nur Beispiele, bei denen mit einem eingelesenen
File oder so gearbeitet wurde.


----------



## Bleiglanz (17. Jun 2005)

einfach serialisieren (einen String erzeugen mit dem xml als inhalt) und dieses durch einen parser jagen, bei dem setValidating(true) ist


----------



## bambi (17. Jun 2005)

Ich glaub' ich stell mich echt bloed an, aber ich bekomm's net hin... sorry.

Wie kann ich denn mein Document (package org.w3c.dom.Document) in einen String umwandeln und mit welchen Package
muss ich es dann parsen? Ich hab' mir mal SAXParser.parse() angesehen. Da war ein Beispiel dazu im Forum hier,
aber die Methode verlangt ja eine URL und kein XML-Document im String-Format, oder?


----------



## foobar (17. Jun 2005)

Benutzdoch mal die Suche:
http://www.java-forum.org/de/viewtopic.php?t=8325&highlight=dom
und guck dir mal die Klasse Transformer an http://java.sun.com/j2se/1.4.2/docs/api/javax/xml/transform/Transformer.html, damit kannst du Dom-Bäumein Strings umwandlen und umgekehrt.


----------



## Bleiglanz (18. Jun 2005)

aber lass das Prüfen bei jedem Schritt, das ist viel zu aufwändig [und bringt eigentlich nichts]

mach am ende deiner verarbeitung ein textfile daraus und validiere dieses Textfile

du musst eben korrekt programmieren, so dass die DTD des Dokuments nicht verletzt wird


----------



## bambi (20. Jun 2005)

Also ich hab' weiter in der API und auf unzaehligen Webseiten gesucht und bin (fast ganz sicher), dass das validieren in
meinem Fall vielleicht doch nicht sooo wirklich viel Sinn macht...

Also ich arbeite mit dem XMLHttpRequest Object mit JavaScript. D.h. ich schicke einen Request an meinen Server, der
generiert mir dann ein XML-Document und schickt es wieder zurueck. Also muss ich bei jedem Request ein neues XMl-Doc
erzeugen... Cachen macht hier auch keinen Sinn oder so, denn es wird eine Suche impementiert und bei jeder Anfrage
habe ich andere Parameter.

Also habe ich ein org.w3c.com.Document, dass ich dann an den PrintWriter meines Servlets anhaenge... Soweit ich das
gesehen habe - bitte berichtigen, wenn's falsch ist - brauche ich mein XML als File oder InputStream, InputSource ... ,
um's auch validieren zu koennen. [Vielleicht 'ne arg bloede Frage, aber man kann einen OutputSteam nicht in einen
InputSteam wandeln, oder?]

Also muesste ich dafuer erst das XML erzeugen, es in einem File speichern, das File auslesen, validieren und kann es dann
erst an mein Servlet haengen und senden??? Mal ehrlich - ist doch super lahm, oder? Ich glaub' da gibt's ein Package
in Java 5, dass das einfacher machen kann - muss aber mit 1.4.2 arbeiten... Und die Zeit, um das alles erst abzuspeichern
und wieder auszulesen, habe ich einfach nicht...

Gibt's da 'ne Loesung? Irgendeine Idee?  :bahnhof:


----------



## Bleiglanz (21. Jun 2005)

Idee: korrekt programmieren?

oder beim client "robust" sein, was soll das ganze Validieren denn bringen, wenns da im sekundentakt hin und hergeht und der user nur eine antwort sehen will??

kannst du doch locker drauf verzichten (validieren ist ja kein MUSS)


----------



## bambi (21. Jun 2005)

Mhhhh, ja darauf wird's dann wohl auch hinauslaufen, denk' ich mal...

So wie's programmiert ist, kann eigentlich auch nix passieren. Die Tags und Daten check ich ja auch vorher - sonst
haett' ich eh Probleme mit der DB und der Client faengt's auch ab...
Aber ich mach' das hier eben in der Firma und da wird eben einfach drauf Wert gelegt, dass die Sachen auch vom Stil
her korrekt sind und solche DTDs verwendet werden. Aber wenn's dann zu langsam wird macht's ja auch keinen Sinn
mehr. Bringt ja nix, wenn das System super korrekt arbeitet - der User aber ewig warten muss und es dann genervt laesst  :wink: 

Aber Dank' Dir fuer Deine Hilfe!


----------

