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 <?xml version="1.0" encoding="UTF-8"?>
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).
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…
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