Helios Co. Geschrieben 18. August 2008 Teilen Geschrieben 18. August 2008 Hallo @all, ich bin ein absoluter newb in Sachen Oracle und habe direkt dielustige Aufgabe ein bzw. mehrere XML files in ein relationales Schema zu drücken. Die XML files die ich habe, sind schon ziemlich komplex und ich möchte sie also in eine (oder vielleicht auch 2)Tabell(en) speichern. Die XMLs haben in etwa folgende Form: <Text ID=123> <Body> <DIV blabla> <Head>blabla</Head> <DIV Type="Das will ich haben in Tabelle 1"> <P>iuhgiu</P> --usw... </DIV> </DIV> <DIV blablub> <Head>blablub</Head> <DIV Type="Das will ich haben in Tabelle 2"> <P>iuhgiu</P> --usw... </DIV> </DIV> </Body> Ich weiß, dass es in Oracle eine ganze Reihe an Lösungen für dieses Problem gibt, doch leider hat beimir bis jetzt nichts gefunzt,so z.B.mit PL/SQL: 1.create directory xmldir as 'c:\emp; 2. CREATE TABLE ORACLE_TABLE ( KEY_COLUMN VARCHAR2(10 BYTE), XML_COLUMN XMLTYPE, PRIMARY KEY (KEY_COLUMN)); 3. insert into ORACLE_TABLE(key_column,xml_column) values (1, XMLTYPE('XMLDIR','test.xml',nls_charset_id('UTF-8'))); Hier kriege ich den Fehler, dass es sich nicht um ein gültiges XDB Schema handelt. Mir ist es im Prinzip egal, mit welchen Mitteln ich das Problem löse, aber könntet ihr mir Schritt für Schritt erklären wie das geht? Vielleicht auch mit Code? Thx! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 18. August 2008 Teilen Geschrieben 18. August 2008 Hallo @all, ich bin ein absoluter newb in Sachen Oracle und habe direkt dielustige Aufgabe ein bzw. mehrere XML files in ein relationales Schema zu drücken. Die XML files die ich habe, sind schon ziemlich komplex und ich möchte sie also in eine (oder vielleicht auch 2)Tabell(en) speichern. Die XMLs haben in etwa folgende Form: <Text ID=123> <Body> <DIV blabla> <Head>blabla</Head> <DIV Type="Das will ich haben in Tabelle 1"> <P>iuhgiu</P> --usw... </DIV> </DIV> <DIV blablub> <Head>blablub</Head> <DIV Type="Das will ich haben in Tabelle 2"> <P>iuhgiu</P> --usw... </DIV> </DIV> </Body> Ich weiß, dass es in Oracle eine ganze Reihe an Lösungen für dieses Problem gibt, doch leider hat beimir bis jetzt nichts gefunzt,so z.B.mit PL/SQL: 1.create directory xmldir as 'c:\emp; 2. CREATE TABLE ORACLE_TABLE ( KEY_COLUMN VARCHAR2(10 BYTE), XML_COLUMN XMLTYPE, PRIMARY KEY (KEY_COLUMN)); 3. insert into ORACLE_TABLE(key_column,xml_column) values (1, XMLTYPE('XMLDIR','test.xml',nls_charset_id('UTF-8'))); Hier kriege ich den Fehler, dass es sich nicht um ein gültiges XDB Schema handelt. Mir ist es im Prinzip egal, mit welchen Mitteln ich das Problem löse, aber könntet ihr mir Schritt für Schritt erklären wie das geht? Vielleicht auch mit Code? Thx! Hallo, Habe die Frage nicht ganz verstanden. Möchtest du einfach ein XML in der Datenbank ablegen ? Oder möchtest du das XML "aufdröseln" und in Tabellenfelder ablegen ? Gruss Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 18. August 2008 Teilen Geschrieben 18. August 2008 <Text ID=123> <Body> <DIV blabla> <Head>blabla</Head> <DIV Type="Das will ich haben in Tabelle 1"> <P>iuhgiu</P> --usw... </DIV> </DIV> Das wäre dann kein valides XML, dess es fehlt der komplette XML Header mit Versions- und Encodingangabe. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 18. August 2008 Teilen Geschrieben 18. August 2008 (bearbeitet) Das wäre dann kein valides XML, dess es fehlt der komplette XML Header mit Versions- und Encodingangabe. Dim - Ich glaube, das ist Oracle in diesem Fall egal, solange er kein Schema registriert hat. Invalid ist es allerdings schon, d.h sobald du Xpath oder XQuery darauf absetzen willst oder einen Oracle.Text Index (xmlsectiongroup) darauf setzten willst, gibt es Probleme Gruss Bearbeitet 18. August 2008 von dbwizard Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Helios Co. Geschrieben 18. August 2008 Autor Teilen Geschrieben 18. August 2008 Die Idee war folgende: Ich lade das ganze XML file als Spalte in eine Tabelle, und parse sie hier. Das hochladen hat jetzt geklappt, die Lösung war folgende: insert into mytable1(key_column,xml_column) values (1,XMLTYPE ( BFILENAME('XMLDIR','test.xml'),nls_charset_id('UTF-8'))); Jetzt stellt sich nur die Frage, wie ich das Ding parsen kann. Habt ihr Tips? Thx Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 18. August 2008 Teilen Geschrieben 18. August 2008 (bearbeitet) Habt ihr Tips? Thx - Ja :-) Einerseits kannst du auf das XML einen XPATH Ausdruck loslassen. Ich gebe dir einen Extract aus einem Teil unseres Codes, musst du natürlich anpassen. Dabei ist : -nevent_id der PK des Datensatzes, welches das XML (Als SYS.XMLTYPE) enthält... -event_xml die XML-Spalte.... - Ich habe die Namespaces unkenntlich gemacht FUNCTION get_action (nevent_id IN NUMBER) RETURN VARCHAR2 IS l_nevent_id app_xml_event.event_id%TYPE; l_result v_get_code_short.value_d%TYPE; BEGIN l_nevent_id := nevent_id; SELECT EXTRACTVALUE (e.event_xml, '/Event/Content/EventContext/Action/t:Label', 'xmlns="http://www.blabla/event" xmlns:t="http://www.blabla/types"' ) INTO l_result FROM app_xml_event e WHERE (event_id = l_nevent_id); RETURN (l_result); EXCEPTION WHEN NO_DATA_FOUND THEN RETURN ''; END; - Ich würde eine Blick in die Doku werfen (Suche nach EXTRACTVALUE), es gibt da einiges zu lesen :-) - Andererseints kannst du ab 10g auch mit XQUERY drauf los--> Doku Gruss Bearbeitet 18. August 2008 von dbwizard Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Helios Co. Geschrieben 19. August 2008 Autor Teilen Geschrieben 19. August 2008 @dbwizard: Wow vielen Dank fürden Code, das hat mich im Verständnis um das Ganze jetzt ein gutes Stück vorangebracht! Anhand deines Beispiels habe ich jetzt folgendes SQL Query verzapft: SELECT EXTRACTVALUE(e.XML_COLUMN, '/CESDOC/TEXT/BODY/DIV/HEAD/DIV/@ID=FXAC93006ENC.0001.01.00') FROM ORACLE_TABLE e WHERE e.KEY_COLUMN = 1; Das entspricht jetzt in etwa meinem XML file. Leider kriege ich hier einen Fehler:ORA31012:Angegebener XPath Audruck nicht unterstützt. Mir ist leider nicht klar, warum der Ausdruck falsch sein soll, wobei meine praktischen Erfahrungen mit XPath auch nicht unbedingt gut sind. In dem Zusammenhang auch noch eine Frage: Im XML file habe ich mehrere solche TEXT/BODY/DIV/HEAD/DIV/@ID=FXAC93006ENC.0001.01.00' Knoten. Sie unterscheiden sich lediglich durch die ID, und auch da nur in den letzten Stellen. Mich interessieren jedoch alle diese Textknoten. Gibt es hier so etwas wie ein Wildcard? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Helios Co. Geschrieben 19. August 2008 Autor Teilen Geschrieben 19. August 2008 (bearbeitet) Ohh, eine 15 Minuten Änderungsfrist sowas habe ich auch noch nicht erlebt in meiner langjährigen Forumskariere, macht aber Sinn. Daher dieser Nachtrag: 1. Was genau bedeutet das: v_get_code_short.value_d%TYPE; ->Handelt es sich dabei um den Zielort des geparsten Textes? 2.Das IS ist wahrscheinlich ein AS, oder? Thx Nachtrag zu den oben gestellten Fragen: Das XML file hat schon einen Header (den habe ich jetzt nur nicht in der einfachen Form oben eingetragen) Und ja ich möchte das file in eine Tabelle einfügen und den Inhalt dann so parsen, dass ich ganz bestimmte Werte in eine andere Tabelle speichern kann (hier dann quasi als Text und verteilt auf bestimmte Spalten) Dieser Nachtrag nur um die Vollständigkeit zu wahren. Bearbeitet 19. August 2008 von Helios Co. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 19. August 2008 Teilen Geschrieben 19. August 2008 (bearbeitet) Ohh, eine 15 Minuten Änderungsfrist sowas habe ich auch noch nicht erlebt in meiner langjährigen Forumskariere, macht aber Sinn. Daher dieser Nachtrag: 1. Was genau bedeutet das: v_get_code_short.value_d%TYPE; 2.Das IS ist wahrscheinlich ein AS, oder? Thx 1. Du referenzierst den Typ einer Tabellspalte (oder hier einerView) und weist diesen Typ der Variablen zu : Also myVariable:=varchar2(10); ODER myVariable:=Mytable.MyAttribute%TYPE; --> Jetzt ist myVariable vom Typ des Attributes in der Tabelle 2. Nö, is schon richtig so, ist in einem Package - Zu deiner obigen Frage : Mehrere Elemente desselben Typs nennst man eine XMLSEQUENCE...schau das mal in der Doku nach oder dieser link : ORACLE-BASE - Oracle9i XMLSEQUENCE Gruss Bearbeitet 19. August 2008 von dbwizard Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Helios Co. Geschrieben 19. August 2008 Autor Teilen Geschrieben 19. August 2008 Danke für den link!:beagolisc Und leider muss ich wiedermit Fragen nerven. Ich habe folgedes Query: INSERT INTO Ergebnisse (Inhalt) SELECT * FROM( SELECT EXTRACTVALUE(e.XML_COLUMN, 'DIV/@ID=FXAC93006ENC.0001.01.00') FROM ORACLE_TABLE e WHERE e.KEY_COLUMN = 1); Ich kriege einen XPath Fehler (currently not supported XPath). Was ist falsch? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 19. August 2008 Teilen Geschrieben 19. August 2008 (bearbeitet) Danke für den link!:beagolisc Und leider muss ich wiedermit Fragen nerven. Ich habe folgedes Query: Ich kriege einen XPath Fehler (currently not supported XPath). Was ist falsch? kannst du mal den teil des xml's posten, der 'DIV/@ID=FXAC93006ENC.0001.01.00' enthält ? Bin nicht ganz sicher, aber ich denke, es fehlt ein / am Anfang, also : INSERT INTO Ergebnisse (Inhalt) SELECT * FROM( SELECT EXTRACTVALUE(e.XML_COLUMN, '/DIV/@ID=FXAC93006ENC.0001.01.00') FROM ORACLE_TABLE e WHERE e.KEY_COLUMN = 1); Gruss BTW, wenn du öfters XPATH benutzt, rentiert ein guter XML Editor wie XML-Spy oder so, da kannst du xpath - statements testen und auch generieren lassen ..ach ja, welche DB version benutzt du ? die 9er war noch etwas buggy beim XML.... Bearbeitet 19. August 2008 von dbwizard Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Helios Co. Geschrieben 19. August 2008 Autor Teilen Geschrieben 19. August 2008 (bearbeitet) Vielen Dank für den Tip mit XMLSpy! Das ist ein Auszug aus dem Ding: <?xml version="1.0"?> <CESDOC TYPE="text" VERSION="4.2" TEIFORM="TEI.2"> <CESHEADER ID="JOC006CE.SGM" TYPE="text" blablabla"> <FILEDESC> <TITLESTMT> <H.TITLE>blubliubswdw</H.TITLE> </TITLESTMT> <EXTENT> <WORDCOUNT>27740</WORDCOUNT> <BYTECOUNT UNITS="KB">253</BYTECOUNT> <EXTNOTE>cwwwcwc</EXTNOTE> </EXTENT> <PUBLICATIONSTMT> <DISTRIBUTOR>cfdcwsc</DISTRIBUTOR> <PUBADDRESS>cwcweccw</PUBADDRESS> <TELEPHONE>cwscew</TELEPHONE> <FAX>ccwwc</FAX> <EADDRESS TYPE="email">cwcwecw</EADDRESS> <EADDRESS TYPE="http">cwwcw</EADDRESS> <AVAILABILITY REGION="world" STATUS="UNKNOWN">cwwcwccw</AVAILABILITY> <PUBDATE>cwwc</PUBDATE> </PUBLICATIONSTMT> <SOURCEDESC DEFAULT="N"> <BIBLFULL> <TITLESTMT> <H.TITLE>cwwcw</H.TITLE> </TITLESTMT> <EDITIONSTMT VERSION="A"></EDITIONSTMT> <PUBLICATIONSTMT> <DISTRIBUTOR>ewfwefwefwef</DISTRIBUTOR> <PUBADDRESS>d2d32d2d</PUBADDRESS> <TELEPHONE>+wefwefwe</TELEPHONE> <FAX>ewfwefew</FAX> <EADDRESS TYPE="email">wefwefwef</EADDRESS> <AVAILABILITY REGION="world" STATUS="UNKNOWN">fwefewff</AVAILABILITY> <PUBDATE>cqewceqc</PUBDATE> </PUBLICATIONSTMT> </BIBLFULL> </SOURCEDESC> </FILEDESC> <ENCODINGDESC> <PROJECTDESC DEFAULT="N">qwdqwdqwdqw.</PROJECTDESC> <TAGSDECL> wcwcwqc </TAGSDECL> </ENCODINGDESC> <PROFILEDESC> &langusage.entity; &wsdusage.entity; <TRANSLATIONS> <TRANSLATION>../../GE/ORIGINAL/JOC006CE.SGM</TRANSLATION> </TRANSLATIONS> </PROFILEDESC> </CESHEADER> <TEXT ID="FXA93006ENC" LANG="EN" COMPLETE="Y"> <BODY> <DIV COMPLETE="Y" TYPE="DOCUMENT"> <HEAD N="dwewe"</HEAD> <DIV ID="FXAC93006ENC.0001.01.00" COMPLETE="Y" TYPE="RECORD"> <HEAD N="dded"</HEAD> <DIV COMPLETE="Y" TYPE="WQA"> <HEAD N="OR"> WRITTEN QUESTION <ABBR>Nº</ABBR> <NUM TYPE="WQREF">1704/91</NUM> by <NAME TYPE="PERSON"> <ABBR REND="TAIL-SUPER">Mr</ABBR> Vincenzo Mattina (S) </NAME> ewudhwedwed <DATE>(ewd)</DATE> </HEAD> <HEAD N="INFO">(93/C 6/01)</HEAD> <DIV COMPLETE="Y" TYPE="BODY"> <DIV COMPLETE="Y" TYPE="Q"> <HEAD>wedwedw </HEAD> <P>Can the Commission say:</P> <P>1. ewdw edwe </P> <P>2. wedwed w</P> <P>3. wedwdw </P> <P>4. ewd we </P> <P>5. erfwefweqf</P> <P>6. wefwe</P> </DIV> <DIV COMPLETE="Y" TYPE="R"> <HEAD> ewfwefqw <NAME TYPE="PERSON"> <ABBR REND="TAIL-SUPER">Mr</ABBR> fewfewf </NAME> wefwef <DATE>(wefwe)</DATE> </HEAD> <P>ewf</P> </DIV> </DIV> </DIV> </DIV> Interessieren tun mich dabei nur folgende Teile: <TEXT ID="FXA93006ENC" LANG="EN" COMPLETE="Y"> <BODY> <DIV COMPLETE="Y" TYPE="DOCUMENT"> <HEAD N="dwewe"</HEAD> <DIV ID="FXAC93006ENC.0001.01.00" COMPLETE="Y" TYPE="RECORD"> <HEAD N="dded"</HEAD> <DIV COMPLETE="Y" TYPE="WQA"> <HEAD N="OR"> WRITTEN QUESTION <ABBR>Nº</ABBR> <NUM TYPE="WQREF">1704/91</NUM> by <NAME TYPE="PERSON"> <ABBR REND="TAIL-SUPER">Mr</ABBR> Vincenzo Mattina (S) </NAME> ewudhwedwed <DATE>(ewd)</DATE> </HEAD> <HEAD N="INFO">(93/C 6/01)</HEAD> <DIV COMPLETE="Y" TYPE="BODY"> <DIV COMPLETE="Y" TYPE="Q"> <HEAD>wedwedw </HEAD> <P>Can the Commission say:</P> <P>1. ewdw edwe </P> <P>2. wedwed w</P> <P>3. wedwdw </P> <P>4. ewd we </P> <P>5. erfwefweqf</P> <P>6. wefwe</P> </DIV> <DIV COMPLETE="Y" TYPE="R"> <HEAD> ewfwefqw <NAME TYPE="PERSON"> <ABBR REND="TAIL-SUPER">Mr</ABBR> fewfewf </NAME> wefwef <DATE>(wefwe)</DATE> </HEAD> <P>ewf</P> </DIV> </DIV> </DIV> </DIV> Wenn man beim XPath Ausdruck den ersten Slash weglässt (so dachte ich), gibt man einen relativen Pfad an und der Referenzknoten ist der erste in der Zeile. Hab eich das falsch verstanden? Bearbeitet 19. August 2008 von Helios Co. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Helios Co. Geschrieben 19. August 2008 Autor Teilen Geschrieben 19. August 2008 INSERT INTO Ergebnisse (Inhalt) SELECT * FROM( SELECT EXTRACTVALUE(e.XML_COLUMN, '/CESDOC/TEXT/BODY/DIV/DIV/DIV/DIV/DIV/@TYPE = 'Q'') FROM ORACLE_TABLE e WHERE e.KEY_COLUMN = 1); XMLSpy hat wirklich weitergeholfen. Das hier müsste jetzt passen,allerdings tritt wieder ein Fehler auf: ORA01756: Anführungsstrich fehlt bei Zeichenfolge. Mir ist jedoch nicht klar,wo hier Anführungsstriche fehlen?! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 20. August 2008 Teilen Geschrieben 20. August 2008 Hier: (e.XML_COLUMN, '/CESDOC/TEXT/BODY/DIV/DIV/DIV/DIV/DIV/@TYPE = '[b]'[/b]Q[b]'[/b]'') In einem String müssen ' mit '' maskiert werden. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Helios Co. Geschrieben 20. August 2008 Autor Teilen Geschrieben 20. August 2008 (bearbeitet) Wenn ich das also richtig verstanden habe, dann soll das Q in Anführungsstriche gesetzt werden?! (bzw. in 2 ' Strich.) Wenn ich das aber mache, dann kriege ich(in beiden Fällen) einen XPath Feher, obwohl dieser (laut XSpy) richtig ist. Bearbeitet 20. August 2008 von Helios Co. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 20. August 2008 Teilen Geschrieben 20. August 2008 Wenn ich das also richtig verstanden habe, dann soll das Q in Anführungsstriche gesetzt werden?! Keine Ahnung. ich hab nur den Fehler behoben, der mir aufgefallen ist. Ob der Code überhauot richtig ist - keine Ahnung. Ich hab es bisher erfolgreich vermieden allzuviel mit XML zu tun zu haben Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 20. August 2008 Teilen Geschrieben 20. August 2008 Ich hab es bisher erfolgreich vermieden allzuviel mit XML zu tun zu haben Dim - Spätestens mit Oracle 11 (aber auch schon mit 10) sind da aber ein paar mächtige Sachen dabei.... Gruss Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Helios Co. Geschrieben 20. August 2008 Autor Teilen Geschrieben 20. August 2008 (bearbeitet) Hmm stimmt, die 11gVersion ist wirklich mächtig. Es gibt fast schon zu viele Möglichkeiten mit XML zu arbeiten. Sehr verwirrend für Einsteiger,leider. Aber nochmals zu der Anfrage: Ich habe den XPath AUsruck noch einmal vereinfacht. INSERT INTO Ergebnisse (Inhalt) SELECT * FROM( SELECT EXTRACTVALUE(e.XML_COLUMN, '/CESDOC/TEXT/BODY/DIV/DIV/') FROM ORACLE_TABLE e WHERE e.KEY_COLUMN = 1); Damit gibts jetzt aber folgenden Fehler: ORA31011: XML Parsing nicht erfolgreich. Hmm, was genau liefert denn die EXTRACTVALUE Funktion? Welchen Datentyp? Ich möchte damit in die Realtion "Ergebnisse" und hier in die Spalte "Inhalt" all das einfügen, was aus der Relation "Oracle_Table" aus der XMLType Spalte "XML_COLUMN" anhand des XPath Ausdrucks extrahiert wird, einfügen. Bearbeitet 20. August 2008 von Helios Co. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 20. August 2008 Teilen Geschrieben 20. August 2008 Hmm, was genau liefert denn die EXTRACTVALUE Funktion? Welchen Datentyp? - Varchar2. Es wird immer ein String zurückgegeben, du muss explitzit konvertieren. Gruss Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.