Zum Inhalt springen

XML zu Oracle konvertieren


Helios Co.

Empfohlene Beiträge

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von dbwizard
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von dbwizard
Link zu diesem Kommentar
Auf anderen Seiten teilen

@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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Helios Co.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von dbwizard
Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für den link!:beagolisc

Und leider muss ich wiedermit Fragen nerven. :D

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für den link!:beagolisc

Und leider muss ich wiedermit Fragen nerven. :D

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 von dbwizard
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Helios Co.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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?!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Helios Co.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...