# JaxB SchemaFactory



## Biene82 (17. Aug 2007)

Hallo,

Ich will mit Hilfe der SchemaFactory von JaxB XML Statements gegen das Schema validieren. 

Quellcode:

```
//Create a JAXBContext instance
            JAXBContext jc = JAXBContext.newInstance("videothek");
            
            //Create a marshaller instance
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            
            //Create the insert statement
            OraclePreparedStatement stmt = (OraclePreparedStatement) my_con.prepareStatement(
            		"update videothek_xml v set v.videothek = appendchildxml(v.videothek, '/videothek/filme', XMLType(?))");
            
            StringWriter swriter = new StringWriter();
				
			
			SchemaFactory sf = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
			Schema schema = sf.newSchema(new File("videothek.xsd"));
			
			marshaller.setSchema(schema);
            
			
            //Marshal record object in a string
            marshaller.marshal(f, swriter);        
            
            String str = swriter.toString();
            
            stmt.setString(1, str);

            stmt.execute();
            my_con.commit();
```

Die Validierung an sich scheint damit zu funktionieren. So kann ich beispielsweisen keine Tags einfügen die im Schema nicht vorgesehen sind. Anders ist es mit den Attributen. Im Schema sind mittels key und keyref ein paar constraints vorgesehen, die beim marshalling einfach ignoriert werden!

So können beispielsweise mehrere Personen mit gleicher id eingefügt werden oder referenzen auf personen die es gar nicht gibt...

das Schema dazu sieht wie folgt aus:


```
<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="videothek">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="filme"/>
				<xs:element ref="personen"/>
			</xs:sequence>
		</xs:complexType>
		<xs:key name="person_id">
			<xs:selector xpath="./personen/person"/>
			<xs:field xpath="@p_id"/>
		</xs:key>
		<xs:keyref name="schauspieler_ref" refer="person_id">
			<xs:selector xpath="./filme/film/cast/schauspieler"/>
			<xs:field xpath="@id"/>
		</xs:keyref>
		<xs:keyref name="regie_ref" refer="person_id">
			<xs:selector xpath="./filme/film/regie"/>
			<xs:field xpath="@id"/>
		</xs:keyref>
	</xs:element>
	<xs:element name="film">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="titel" type="xs:string"/>
				<xs:element name="jahr" type="xs:long"/>
				<xs:element name="regie">
					<xs:complexType>
						<xs:attribute name="id" type="xs:long" use="required"/>
					</xs:complexType>
				</xs:element>
				<xs:element name="cast">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="schauspieler" maxOccurs="unbounded">
								<xs:complexType>
									<xs:attribute name="id" type="xs:long"/>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element ref="auszeichnungen"/>
			</xs:sequence>
			<xs:attribute name="f_id" type="xs:long" use="required"/>
		</xs:complexType>
	</xs:element>
	
	<xs:element name="person">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="name" type="xs:string"/>
				<xs:element name="vorname" type="xs:string"/>
				<xs:element ref="auszeichnungen"/>
			</xs:sequence>
			<xs:attribute name="p_id" type="xs:long" use="required"/>
		</xs:complexType>
	</xs:element>
	
	<xs:element name="auszeichnungen">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="auszeichnung"  minOccurs="0" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="auszeichnung" type="xs:string"/>
	<xs:element name="filme">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="film" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="personen">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="person" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>
```

Hat von euch jemand ne Idee was da schieflaufen könnte? Hab ich was vergessen oder übersehen? In XMLSpy funktioniert das Schema jedenfalls wunderbar.... auch die constraints!

Habe mir damit nun schon die ein oder andere Nacht um die Ohren gehauen und bin für jede Hilfe dankbar!

Gruss
Biene


----------



## evil_one (21. Aug 2007)

Welche JAXB version Verwendest du?
Soweit ich weiß wird ab der 2.0 auf das validieren beim Marshaller verzichtet.


----------

