Hallo,
Ich will mit Hilfe der SchemaFactory von JaxB XML Statements gegen das Schema validieren.
Quellcode:
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:
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
Ich will mit Hilfe der SchemaFactory von JaxB XML Statements gegen das Schema validieren.
Quellcode:
Code:
//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:
Code:
<?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