# XML Schema



## susa. (7. Nov 2005)

Hallo,

bin total verwirrt. Ich weiß, dass das Thema schon hundert Mal gefragt wurde, aber ich habe immernoch keinen Durchblick. 
Also zu meinem Problem: Ich habe ein XML-Schema, das wie folgt aussehen könnte (habs mal gekürzt):

```
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xs:element name="CREATE">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="NUMMER">
					<xs:simpleType>
						<xs:restriction base="xs:string">
							<xs:maxLength value="15"/>
						</xs:restriction>
					</xs:simpleType>
				</xs:element>
				<xs:element name="FEHLER">
					<xs:complexType>
						<xs:simpleContent>
							<xs:extension base="xs:string">
								<xs:attribute name="fehlercode" type="xs:int"/>
							</xs:extension>
						</xs:simpleContent>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>
```
So, um ein XML-File mit solch einem Schema zu erstellen habe ich per Hand mit dem SaxBuilder folgendes geschrieben:

```
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","C:\\temp\\res.xsd"); 
rootElement = new Element("CREATE"); 
Element myElement = new Element("NUMMER"); 
myElement = myElement.addContent("12");
rootElement.addContent(myElement);
                                        
Element myElement2 = new Element("FEHLER"); 
myElement2.addContent("error");
myElement2.setAttribute("fehlercode", "1");
rootElement.addContent(myElement2);
                                        
 doc = new Document();
doc.setRootElement(rootElement);
						 				
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file))); 
org.jdom.output.Format format = org.jdom.output.Format.getPrettyFormat(); 
new XMLOutputter(format).output(doc, out); 
out.close();
```

Funktioniert ja auch soweit. ABER: Er beachtet bei der Art und Weise überhaupt nicht, ob es nach dem Schema C:\\temp\\res.xsd geht. 
Meine Frage also: Wie muss ich den Quellcode verändern, dass er mir ne Fehlermeldung bringt, wenn ich ein XML-Dokument erstellen will, dass nicht nach dem Scheme aufgebaut ist?

Vielen Dank schon VOrher


----------



## Bleiglanz (7. Nov 2005)

hoffentlich hast du Java5, das Arbeiten mit Schemas mit dem JDK <=1.4 ist etwas zäh


```
SAXParserFactory saxfactory = SAXParserFactory.newInstance();
saxfactory.setValidating(true);
```

http://www-128.ibm.com/developerworks/java/library/x-jaxpval.html


----------



## susa. (7. Nov 2005)

Toll!!!
Super Link!!!! Dankeschön!! Funktioniert auch super!
Trotzdem hab ich noch ein Problem:


```
<xs:annotation>
			<xs:documentation>Comment describing your root element</xs:documentation>
		</xs:annotation>
```

steht im .xsd drin. 

und bekomme jetzt den Fehler:

```
Fehler bei Validierung 
org.xml.sax.SAXParseException: s4s-elt-character: 
Non-whitespace characters are not allowed in schema elements other than 'xs:appinfo' and 'xs:documentation'. 
Saw '001'
```

Hab schon nachgeschaut. Wenn man dieses Annotation in dem Schema drin hat,  sollen da 2 Felder (appinfo und documentation) sein. (keine "normalen" Elemente, sonst würde ja da stehen <xs:element name=annotation>, oder?)

Die Fragen:
Bedeutet die Fehlermeldung, dass eben diese Elemente fehlen? Wenn ja, wie kann ich annotation mit den Unterpunkten appinfo und documentation  anlegen?

Vielleicht hilft der Quelltext der Validierung?

```
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaSource =  new StreamSource(new File("C:\\temp\\tmp.xml"));
Schema schema = schemaFactory.newSchema(schemaSource);   
Validator validator = schema.newValidator();
validator.validate(new StreamSource(new File("C:\\temp\\response.xsd")));
```


----------



## susa. (8. Nov 2005)

So, Geschafft! Danke nochmal für die Hifle, Bleiglanz!
Und für jeden der mal kompletten Code für eine Validierung sucht, hier isser  :


```
SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Source schemaSource =  new StreamSource(new File("C:\\temp\\response.xsd"));
Schema schema = schemaFactory.newSchema(schemaSource);                     
Validator validator = schema.newValidator();
validator.validate(new StreamSource(new File("C:\\temp\\tmp.xml")));
```


----------



## byte (8. Nov 2005)

Ich habe den Code mal an ner falschen XML-Datei getestet und bekomme keine Fehlermeldung. Irgendwas kann da noch nicht stimmen!?


----------



## Roar (8. Nov 2005)

musst wohl noch mit validator.setErrorHandler() nen handler hinzufügen


----------



## Bleiglanz (9. Nov 2005)

Nachtrag: noch ein guter Link

http://java.sun.com/developer/EJTechTips/2005/tt1025.html


----------



## susa. (14. Nov 2005)

Hi, also ich hab den auchmal getestet, und da kommt eine Fehlermeldung so wie ich sie will. hab den code allerdings noch in try und catch und gebe dann den gecatchten error aus. Und dann sagt er genau, was fehlt bzw. was erwartet wird vom Schema.


----------

