Tutorial XML-Validierung in Oracle XML-DB
In diesem Praxisbeispiel möchte ich den Einsatz einer flexiblen XML-Schemavalidierung unter Einsatz von Oracle XML-DB erläutern.
Dabei gehe ich auf die notwendigen Arbeitsschritte ein. Dazu zählen u.a. die Auwahl und Definition des Datentypen XMLType, die Registrierung der XSD-Schemata sowie die Wahl der notwendigen Validierungsmethoden.
Als Voraussetzung zur Durchführung dieses Tutorials wird eine installierte Oracle Datenbank in der Version 11R2 benötigt. Des Weiteren ist eine installierte und konfigurierte Oracle XML-DB notwendig.
Anwendungsbeispiel
Es wird eine Tabelle bereitgestellt in der verschiedene XML-Dokumente abgelegt werden können. Beim Einfügen dieser XML-Dokumente wird eine automatisierte Validierung gegen ein im XML-Dokument hinterlegtes XSD-Schema vorgenommen. Diese Tabelle kann z.B. als Importtabelle verwendet werden, die wiederum als Ausgangsbasis für eine weitere Verarbeitung genutzt werden kann.
Tabelle anlegen
Es wird der Oracle Datentyp XMLType mit der Storageoption BINARY XML verwendet. Dieser hat den Vorteil, dass das XML-Dokument pre-parsed im Binärformat in der Oracle Datenbank vorliegt. Dadurch ergeben sich laut Oracle Dokumentation Speicherplatzeinsparungen und schnellere Zugriffe auf Elemente innerhalb des XML-Dokumentes.
Der Spalte xmldaten wird als Binary XMLType ohne Angabe eines konkreten XSD-Schema angelegt. Man spricht dann von einem „non-schema-based binary XMLType„.
1 2 3 4 5 |
CREATE TABLE besserdich_bestellungen (id number ,schemaURL VARCHAR2(250) ,xmldaten xmltype ) Tablespace tbl_besserdich XMLType COLUMN "XMLDATEN" STORE AS BINARY XML; |
XSD-Schema in der Oracle XML-DB registrieren
Ich habe ein XSD-Schema entwickelt, welches eine Bestellung widerspiegeln soll. Es muss eine Lieferadresse sowie mindestens ein Artikel angegeben werden.
Diese XSD-Schema wird wie folgt in der Oracle XML-DB registriert.
1 2 3 4 5 6 7 8 |
begin dbms_xmlschema.registerSchema( 'http://www.besserdich.com/bestellung_besserdich_V01_00.xsd', '' ,genTypes => FALSE ,genTables =>FALSE ,options => dbms_xmlschema.register_binaryxml); END; |
Wichtig ist hier die Option dbms_xmlschema.register_binaryxml. Das XSD-Schema ist nun unter dem Qualifier http://www.besserdich.com/bestellung_besserdich_V01_00.xsd innerhalb der Oracle Datenbank erreichbar.
Mit dem folgenden SELECT kann man sich alle lokal registrierten XSD-Schemata ansehen.
1 |
select * from user_xml_schemas; |
Trigger mit Logik zur Validierung des XML-Dokumentes
Beim Einfügen eines Datensatzen in die Tabelle besserdich_bestellungen wird mittels Trigger die XML-Validierung angestoßen.
Hier wende ich einen kleinen Trick an, um einen „non-schema-based XMLType“ in einen „schema-based XMLType“ umzuwandeln, um die XMLType-Methode schemaValidate verwenden zu können. Diese führt die XML-Validierung gegen das im Parameter angegebene XSD-Schema durch. Dieses XSD-Schema muss natürlich in der Oracle XML-DB registriert sein.
Warum verwende ich nicht die XMLType Methode isSchemaValid?
- ist um den Faktor 3 langsamer als schemaValidate
- liefert keine qualifizierte Fehlermeldung (Parser Error) sondern nur 0 oder 1 zurück
1 2 3 4 5 6 7 8 9 10 |
create or replace trigger besserdich_xmldaten_bi_trg before insert or update on besserdich_xmldaten for each row declare lv_tmp_xmltype xmltype; begin lv_tmp_xmltype := :new.xmldaten.createSchemaBasedXML(:new.schemaURL); lv_tmp_xmltype.schemaValidate(); end; |
Einfügen eines XML-Dokumentes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
insert into besserdich_bestellungen Values (1,'http://www.besserdich.com/bestellung_besserdich_V01_00.xsd',XMLType ('<!--?xml version="1.0" encoding="UTF-8" ?--> Besserdich Karsten Adolfstr. 9 14165 Berlin 12154 Mineralwasser 0,5 Liter 15 0.45 12152 Mineralwasser 1,0 Liter 30 0.95 ')); |
1 KOMMENTAR
