XML und Datenbanken Fortsetzung XML und Datenbanken 1
Anwendungsszenarien Fakultät für Informatik & Wirtschaftsinformatik XML und Datenbanken Generierung von XML aus Datenbanken Visualisierung von Datenbankinhalten Speicherung von XML-Dokumenten in bestehenden Datenbanken Austausch von Datenbankinhalten Electronic Data Interchange Verbindung verschiedener Softwarekomponenten XML und Datenbanken 2
Anwendungsszenarien DB XML- Generierung XML- Dok. XML- Dok. HTML. Dok. XSLT- Dokument (Stylesheet) XSLT- Transformation sonst. Dok. Generierung/Visualisierung von Datenbankinhalten XML und Datenbanken 3
Anwendungsszenarien II XML- Dok. XML- Anfrage XML- Dok. Abspeicherungsmodul Anfragemodul Speicherung von XML-Dokumenten in bestehende Datenbanken DB XML und Datenbanken 4
Anwendungsszenarien III DB1 Programm I Generierung XML- Dok. Abspeicherung XML-Prozessor DB2 Programm II Austausch von Datenbankinhalten, Electronic Data Interchange (EDI) XML und Datenbanken 5
Feste Menge vorgegebener Datenbankstrukturen create table element ( id number primary key, name varchar2(20) not null, parent_elem_fk number references element(id) on delete cascade, position number not null ); Elemente create table text ( id number primary key, text varchar2(255), element_fk number references element(id) on delete cascade, position number ); Texte create table attribut ( id number primary key, name varchar2(20) not null, value varchar2(80), element_fk references element(id) on delete cascade ); Attribute XML und Datenbanken 6
XML Standard für SQL Fakultät für Informatik & Wirtschaftsinformatik SQLX Standard Reihe von Funktionen zur Unterstützung der Ausgabe von XML mittels SQL-Select-Statements XMLElement XMLAttributes XMLForest XMLAgg XMLConcat XMLRoot XML und Datenbanken 7
von Oracle vordefinierter Typ Fakultät für Informatik & Wirtschaftsinformatik XMLType XMLType zur Speicherung von nativen XML-Dokumenten Anfragen an Dokumente mittels XPath-Unterstützung Funktionen zur Unterstützung der SQL-Anfragen auf XMLType Instanzen: extractvalue(xmltype, XPath) extract(xmltype, XPath) existsnode(xmltype, XPath) xmlsequence(xmltype) transform(xmltype) XML-Schema und XQuery Unterstützung XML und Datenbanken 8
XMLType & DML DML Modifikationsfunktionen updatexml: Führt ein Update eines Wertes/Elements an der durch XPath angegebenen Stelle durch. deletexml: Löscht das/die durch XPath angegebene(n) Element(e). insertxmlbefore: Fügt eine XMLType-Instanz vor der durch XPath spezifizierten Stelle ein. appendchildxml: Fügt eine XMLType-Instanz nach der durch XPath spezifizierten Stelle ein. insertchildxml: Fügt ein XMLElement unterhalb der durch XPath spezifizierten Stelle ein (ist ein Schema angegeben erfolgt der Eintrag automatisch an der richtigen Stelle). XML und Datenbanken 9
transform Führt XSLT-Transformation auf XMLType Instanz aus Input: XSLT-Stylesheet Beispiel (Identity Stylesheet) select value(p).transform(xmltype( <xsl:stylesheet version="1.0 xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> <xsl:template match="node() @*"> <xsl:copy> <xsl:apply-templates select="@* node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>')) from person_xml p Das Identity-Stylesheet gibt den Input Text unverändert zurück. Durch Hinzunahme weiterer Regeln (xsl:template-elemente) können dann bestimmte Teile modifiziert werden. XML und Datenbanken 10
DTD- und Schema-Unterstützung create table person_xml of XMLType; XML und Datenbanken 11
Fakultät für Informatik & Wirtschaftsinformatik DTD- und Schema-Unterstützung insert into person_xml values(xmltype( '<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE Person [ <!ELEMENT Person (Name, Adresse)> <!ATTLIST Person ID CDATA #REQUIRED> <!ELEMENT Adresse (Strasse, Plz, Ort)> <!ELEMENT Name (#PCDATA)> <!ELEMENT Strasse (#PCDATA)> <!ELEMENT Plz (#PCDATA)> <!ELEMENT Ort (#PCDATA)> ]> <Person ID="242"> <Name>Sebbl Seeigel</Name> <Adresse> <Strasse>An der Mole 15</Strasse> <Plz>65432</Plz> <Ort>Salzhausen</Ort> </Adresse> </Person> ')); 1 Zeilen eingefügt XML und Datenbanken 12
DTD- und Schema-Unterstützung insert into person_xml values(xmltype('<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE Person [ <!ELEMENT Person (Name, Adresse)> <!ATTLIST Person ID CDATA #REQUIRED> <!ELEMENT Adresse (Strasse, Hausnummer, Plz, Ort)> <!ELEMENT Name (#PCDATA)> <!ELEMENT Strasse (#PCDATA)> <!ELEMENT Hausnummer (#PCDATA)> <!ELEMENT Plz (#PCDATA)> <!ELEMENT Ort (#PCDATA)> ]> <Person ID="242"> <Name>Sebbl Seeigel</Name> <Adresse> <Strasse>An der Mole 15</Strasse> <Plz>65432</Plz> <Ort>Salzhausen</Ort> </Adresse> </Person>')); SQL-Fehler: ORA-31011: XML-Parsing nicht erfolgreich ORA-19202: Fehler bei XML-Verarbeitung LPX-00103: Warning: Dokumentstruktur stimmt nicht mit DTD überein Error at line 17 aufgetreten ORA-06512: in "SYS.XMLTYPE", Zeile 301 ORA-06512: in Zeile 1 31011. 00000 - "XML parsing failed" *Cause: XML parser returned an error while trying to parse the document. *Action: Check if the document to be parsed is valid. XML und Datenbanken 13
DTD- und Schema-Unterstützung declare str clob; begin str := '<xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema"> <xs:element name="person"> <xs:complextype> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="adresse"> <xs:complextype> <xs:sequence> <xs:element name="strasse" type="xs:string"/> <xs:element name="plz" type="xs:int"/> <xs:element name="ort" type="xs:string"/> </xs:sequence> </xs:complextype> </xs:element> </xs:sequence> <xs:attribute name="id" type="xs:id" use="required"/> </xs:complextype> </xs:element> </xs:schema>'; dbms_xmlschema.registerschema ('http://www.hs-karlsruhe.de/iwi/db2/simpleperson.xsd', str); end; XML und Datenbanken 14
DTD- und Schema-Unterstützung Tabelle, basierend auf XML-Schema definieren create table person_schema_xml of XMLType XMLSCHEMA "http://www.hs-karlsruhe.de/iwi/db2/simple-person.xsd" ELEMENT "Person"; Datensatz einfügen: insert into person_schema_xml values(xmltype('<person ID="242"> <Name>Sebbl Seeigel</Name> <Adresse> <Strasse>An der Mole 15</Strasse> <Plz>65432</Plz> <Ort>Salzhausen</Ort> </Adresse> </Person>')); XML und Datenbanken 15
DTD- und Schema-Unterstützung Keine defaultmäßige Überprüfung auf Schemakonformheit Dokument mit Fehler der nicht erkannt wird: insert into person_schema_xml values(xmltype('<person ID="243"> <Name>Johann Meier</Name> <Adresse/> </Person>')); 1 Zeilen eingefügt XML und Datenbanken 16
DTD- und Schema-Unterstützung Dokument mit Fehler der erkannt wird: begin insert into person_schema_xml values(xmltype( <Person ID="242"> <Name>Sebbl Seeigel</Name> <Anschrift> <Strasse>An der Mole 15</Strasse> <Plz>65432</Plz> <Ort>Salzhausen</Ort> </Anschrift> </Person>')); dbms_output.put_line('fehler: keinen Fehler im XML Dokument gefunden!!'); exception when others then dbms_output.put_line('fehler im XML Dokument erkannt'); end XML und Datenbanken 17
DTD- und Schema-Unterstützung Automatische Validierung gegenüber Schema ist nicht vollständig. Vollständige Validierung mittels zusätzlicher Methoden: member function isschemavalid() return number static procedure schemavalidate() Überprüfen/manuelles Setzen des Validierungsstatus member function isschemavalidated() return number member procedure setschemavalidated(flag IN BINARY_INTEGER := 1) XML und Datenbanken 18
DTD- und Schema-Unterstützung Überprüfung durch Instanzenmethode isschemavalid(...): -- manuelles überprüfen des Datensatzes -- declare xmldoc xmltype; begin select value(x) into xmldoc from person_schema_xml x where existsnode(value(x),'/person[@id="243"]')=1; IF xmldoc.isschemavalid() = 1 THEN dbms_output.put_line('dokument wurde nicht beanstandet'); ELSE dbms_output.put_line('dokument wurde als falsch erkannt'); END IF; end; XML und Datenbanken 19
DTD- und Schema-Unterstützung Überprüfung mittels Trigger: CREATE TRIGGER is_valid_trig BEFORE INSERT OR UPDATE ON person_schema_xml FOR EACH ROW DECLARE newxml XMLType; BEGIn newxml := :new.object_value; XMLTYPE.schemaValidate(newxml); END; XML und Datenbanken 20
XMLType und XQuery Zugriff auf Tabellen/Views vom Typ XMLType: Anlegen eines Views vom Typ XMLType: create or replace view kleinstaaten of xmltype with object id ('/LAND/@ID') as select xmlelement("land", xmlattributes(code as "ID"), xmlforest(capital, population)) from mondial.country c where population < 100000; Test: select value(ks) from kleinstaaten ks; Ausgabe: <LAND ID="AND"><CAPITAL>Andorra la Vella</CAPITAL><POPULATION>72766</POPULATION></LAND> <LAND ID="FL"><CAPITAL>Vaduz</CAPITAL><POPULATION>31122</POPULATION></LAND> <LAND ID="MC"><CAPITAL>Monaco</CAPITAL><POPULATION>31719</POPULATION></LAND>... XML und Datenbanken 21
XMLType und XQuery XQuery: select XMLquery(' let $ks := /LAND let $stadt:=$ks/capital/text() let $id:=$ks/@id return <stadt land="{$id}">{$stadt}</stadt> ' PASSING OBJECT_VALUE RETURNING CONTENT) from kleinstaaten; Ausgabe: <stadt land="and">andorra la Vella</stadt> <stadt land="fl">vaduz</stadt> <stadt land="mc">monaco</stadt> <stadt land="v">vatican City</stadt> <stadt land="rsm">san Marino</stadt> <stadt land="ag">saint Johns</stadt> <stadt land="wd">roseau</stadt>... 15 Zeilen ausgewählt XML und Datenbanken 22
XMLType und XQuery Anfrage: select XMLquery('let $ks := /LAND let $stadt:=$ks/capital/text() let $id:=$ks/@id return <stadt land="{$id}">{$stadt}</stadt>' PASSING OBJECT_VALUE RETURNING CONTENT) from kleinstaaten ks where existsnode(value(ks),'//land[population > 20000]')=1 ; Ausgabe: <stadt land="and">andorra la Vella</stadt> <stadt land="fl">vaduz</stadt> <stadt land="mc">monaco</stadt> <stadt land="v">vatican City</stadt> <stadt land="rsm">san Marino</stadt>... 11 Zeilen ausgewählt XML und Datenbanken 23
XMLType und XQuery Anfrage: select xmlagg(xmlquery('let $ks := /LAND let $stadt:=$ks/capital/text() let $id:=$ks/@id return <stadt land="{$id}">{$stadt}</stadt>' PASSING OBJECT_VALUE RETURNING CONTENT)) from kleinstaaten ks where existsnode(value(ks),'//land[population > 20000]')=1 ; <stadt land="and">andorra la Vella</stadt><stadt land="fl">vaduz</stadt><stadt land="mc">monaco</stadt><stadt land="rsm">san Marino</stadt><stadt land="ag">saint Johns</stadt><stadt land="wd">roseau</stadt><stadt land="wg">saint Georges</stadt><stadt land="kn">basseterre</stadt><stadt land="kir">tarawa</stadt><stadt land="mh">majuro</stadt><stadt land="sy">victoria</stadt> 1 Zeilen ausgewählt. XML und Datenbanken 24