Validieren meines XMLs mit meiner DTD funktioniert nicht

Status
Nicht offen für weitere Antworten.

bambi

Bekanntes Mitglied
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)
Code:
<?xml version="1.0" Encoding="UTF-8"?>
   <PERSONS>
      <WRONG_ELEMENT>test-value</WRONG_ELEMENT>
   </PERSONS>

Dazugehoerige DTD:
Code:
<?xml version="1.0"?>
<!DOCTYPE PERSONS [
    <!ELEMENT PERSON (#PCDATA)>
]>

Java-Code:

Erzeugen des Documents (Ich arbeite mit dem package org.w3c.com.*)
Code:
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
Code:
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:
Code:
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

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

bambi

Bekanntes Mitglied
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

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

bambi

Bekanntes Mitglied
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?
 

Bleiglanz

Gesperrter Benutzer
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

Bekanntes Mitglied
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

Gesperrter Benutzer
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

Bekanntes Mitglied
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!
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben