XML-Dateien einlesen

Hallo zusammen,
bin neu hier, habe aber schon öfter euer Forum zu Rat gezogen, und trotzdem eine Frage:
Ich möchte eine XML-Datei in PostgreSQL aufrufen.

Folgendes habe ich bereits gemacht:

  • Datenbank erstellt: CREATEDB -E unicode testdb;
  • in der Datenbank eine Tabelle mit einer Spalte angelegt: CREATE TABLE test (inhalt xml);


    Folgende XML-Datei habe ich zu testzwecken zur verwendung: buch.xml
<?xml version="1.0" encoding="UTF-8"?> Mein erstes Buch in DocBook Beispielbuch Anton Tester 2004 Dieses Buch ist A. B. gewidmet. Das Vorwort Irgendetwas ist hier erforderlich Eine Kapitel-Überschrift XML und DocBookXML DocBook Ein Anhang Anhang ist optional \ \ \ Nun will ich die Datei einlesen und verwende folgenden Befehl: COPY test FROM '/test/buch.xml';

Daraufhin erscheint folgender Fehler:
ERROR: invalid XML content
DETAIL: Entity: line 1: parser error: XML declaration allowed only at the start of the document
:confused: <?xml version="1.0" encoding="UTF-8"?>

CONTEXT: COPY xml, line1, column inhalt: :confused: <?xml version="1.0" encoding="UTF-8"?>"

Statt :confused: stehen aber “Hieroglyphen”, nämlich ein i mit zwei Punkten, Fragezechen auf dem Kopf, etc…

Hat jemand ne Idee was ich falsch mache ?
Vielen Dank schonmal

Du hast ein Zeichensatzproblem! Die Datei wurde als UTF8-Datei gespeichert und du öffnest diese wie eine ASCII Datei. In diesen Fall siehst du eben genau diese zwei Steuerzeichen am Anfang.

Entweder komplett in UTF arbeiten oder die Datei als ASCII erstellen oder konvertieren (iconv unter *NIX).

cu tb

vielen Dank für die Antwort. Jedoch beschäftige ich mich erst seit kurzem mit PostgreSQL. Wie “arbeite ich denn in UTF” ? Ich dachte bisher es genügt, dass meine Datenbankerstellung mit dem Befehl “CREATEDB -E unicode test” angelegt wurde.

Das Problem ist nicht die Datenbank! Das Problem ist deine XML-Datei. Du kannst auch Textdateien im System als ASCII oder UTF abspeichern. Die Datei ist UTF…

cu tb

Vielen Dank für die Hilfe soweit. Es funktioniert !Arbeite nun komplett in UTF und kann die Datei einlesen.
Allerdings nur wenn ich sämtliche Zeilenumbrüche und Tabulatoren aus der ursprünglichen XML-Datei entferne. In meiner Tabellenspalte erscheint das XML-File dann als “Einzeiler”. Kann man das irgendwie umgehen ?

Für alle die mal des selbe Problem haben:
Mein Ziel war es Daten aus der XML-Datei (Name, Adresse, etc.) rauszufischen und in eine PostgreSQL Datenbank zu schreiben.
Gelungen ist mir das mit Hilfe von XSLT und einem OpenSource Programm namens Treebeard (was schon etwas älter ist aber für diese Zwecke ausreicht). Mit Treebeard kann man mit etwas Übung ein *.xsl Dokument erstellen und sich auch gleich die INSERT-Befehle, etc. anzeigen lassen.
Mit einem Parser (ich habe xsltproc) verwendet schreibt man dann einfach in die Kommandozeile von Postgres:
XSLTPROC dateiname.xsl dateiname.xml | psql datenbankname

Anhand der XSL-Datei werden somit die Daten aus der XML-Datei herausgeholt und in eine vorher angelegte Datenbank geschrieben.

Ob dies jetzt die ideale Lösung ist oder es noch einfachere Möglichkeiten gibt kann ich nicht sagen, da ich erst seit kurzer Zeit mit PostgreSQL arbeite. Es funktioniert aber zumindest