# Validierung gegen Schema mittels DOM



## schlachtrufe (21. Februar 2008)

Hallo,

ich würde gern die Korrektheit einer XML-Datei mittels einer Schema-Datei prüfen. Zum Einlesen der XML-Datei benutze ich DOM.

Meine XML Datei:

```
<?xml version="1.0" encoding="UTF-8"?>
<Beschreibung
xmlns="http://www.person.de"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.person.de mySchema.xsd">
  <Vater name="Peter" alter="40">
     <Kind name="Ralf" alter="10"/>
     <Kind name="Markus" alter="15"/>
  </Vater>
</Beschreibung>
```

Die Schema-Datei:

```
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.person.de"
  xmlns="http://www.person.de">

<xs:element name="Beschreibung">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="Vater" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="Vater">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="Kind" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
  <xs:attribute name="name" type="xs:string" use="required" />
  <xs:attribute name="alter" type="xs:string" use="required" />
  </xs:complexType>
</xs:element>

<xs:element name="Kind">
  <xs:complexType>
    <xs:attribute name="name" type="xs:string" use="required" />
    <xs:attribute name="alter" type="xs:string" use="required" />
  </xs:complexType>
</xs:element>

</xs:schema>
```


Die Programme "XML-Spy" und "XML Copy Editor" sagen beide, dass die XML Datei valide ist, nur mein Programm scheitn das nicht zu merken.

Fehlerausgabe beim Öffnen der XML Datei in meinem Java-Programm:
"org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'Beschreibung'."

Mein Java-Code zum Einlesen und Überprüfen einer XML-Datei:

```
try {
  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  DocumentBuilder db = dbf.newDocumentBuilder();
  doc = db.parse(file);

//Validierung gegen Schema
  SchemaFactory sf =   SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
  File schemata = new File("mySchema.xsd");
  Schema f = sf.newSchema(schemata);
  Validator v = f.newValidator();
  v.validate(new DOMSource(doc.getDocumentElement()));
}
catch (SAXParseException e) {
  e.printStackTrace();
}
```



Ich hab keine Ahnung wo mein Fehler liegt...


----------



## Thomas Darimont (21. Februar 2008)

Hallo,

schau mal hier:
http://www.tutorials.de/forum/java/288770-xml-validierung.html

Gruß Tom


----------



## schlachtrufe (22. Februar 2008)

EDIT: Mein Code (unten) funktioniert nicht! Mit Hilfe des Links von Thomas scheint es jetzt aber zu klappen.

--------------------------


Danke

Ich habs mal implementiert, jedoch den Validator weggelassen. Scheint auch so zu gehen.


```
try {
        File file = ... ;

	SchemaFactory schemafactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
	File schemata = new File("mySchema.xsd");
	Schema schema = schemafactory.newSchema(schemata);

	DocumentBuilderFactory builderfactory = DocumentBuilderFactory.newInstance();

	builderfactory.setNamespaceAware(true);
	builderfactory.setSchema(schema);	
	DocumentBuilder builder = builderfactory.newDocumentBuilder();
	
	builder.setErrorHandler(new ErrorHandler() {
		public void error(SAXParseException exception)
				throws SAXException {
			throw new SAXParseException("error", null);
		}
		public void fatalError(SAXParseException exception)
				throws SAXException {
			throw new SAXParseException("fatalError", null);
		}
		public void warning(SAXParseException exception)
				throws SAXException {
			throw new SAXParseException("warning", null);
		}
	});	
	doc = builder.parse(file);	
	} 
catch(SAXParseException e) {
	e.printStackTrace();
}
```

Hätte jetzt allerdings noch eine Frage, will dafür nicht extra einen neuen Thread aufmachen:

Wie bewerkstellige ich es, die Informationen zur Schema in die XML-Datei zu schreiben?

Schreiben tue ich wie folgt:

```
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	DocumentBuilder p = factory.newDocumentBuilder();
	Document doc = p.newDocument();

       Element e = doc.createElement("Beschreibung");
       doc.appendChild(e);
       //....Attribute setzen

       try {
	File fn = setFile(".");
			
	FileOutputStream fOut = new FileOutputStream(fn, false);
	TransformerFactory transfac = TransformerFactory.newInstance();
	Transformer trans = transfac.newTransformer();
			
	trans.setOutputProperty(OutputKeys.INDENT, "yes"); 
	trans.transform(new DOMSource(doc), new StreamResult(fOut)); 
}
catch(NullPointerException npEx) {}
```

Nur wie ich das 





> xmlns="http://www.person.de"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://www.person.de mySchema.xsd">


 mit rein bekomme hab ich noch nicht raus gefunden.


----------

