SQL MySQL und Load XML

Nebuk

Lieutenant
Registriert
Sep. 2009
Beiträge
892
Hallo zusammen

Ich komme mal wieder mit einem Problem an dem ich jetzt schon etwas länger sitze und hoffe, dass ihr mir einen kleinen Tipp geben könntet.

Es geht darum, dass ich eine Datenbank mit verschiedenen Tabellen habe welche alle leer sind. Dann habe ich verschiedene XML Dateien welche gleich aufgebaut sind wie die Tabellen der DB. Dort drinnen befinden sich die Werte welche ich gerne in die DB spielen würde.

Bei MySQL gibt es ja die tolle Funktion LOAD XML welche die Datei einliest und in die entsprechende Tabelle spielt. Dies funktioniert grundsätzlich auch, aber die Funktion wie ich sie nutze hat Probleme mit Emtpy Tags (also sowas: <leer/>). Wie schaffe ich es die XML Dateien so einzulesen wie sie sind ohne, dass ich sie gross manuell anpassen muss?

In folgendem Beispiel würde mir nur der Eintrag "Ended" von <SerieStatus> korrekt in die DB importiert werden. Alle anderen Werte würden mit einem leeren String (Varchar), 0000-00-00 (date) oder 0 (double und int) eingetragen.

Tabelle 'Serie' in DB:
Code:
CREATE TABLE IF NOT EXISTS Serie (
  id int(11) NOT NULL, 
  SerieName varchar(64) CHARACTER SET utf8 NOT NULL,
  SerieBeschreibung varchar(1024) CHARACTER SET utf8 NOT NULL,
  Bemerkung varchar(512),
  Bewertung double NOT NULL,
  AnzBewertungen int NOT NULL,
  ErsteAusstrahlung date,
  Schauspieler varchar(128) CHARACTER SET utf8, 
  SerieStatus varchar(64) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Rohdaten zum Importieren als XML:
Code:
<Data>
  <Series>
    <id>1</id>
    <SerieName>Fargo</SerieName>
    <SerieBeschreibung>Im Januar 2006 kommt Lorne Malvos Auto in Bemidji, Minnesota nach einem Zusammenstoß mit einem Reh zum Liegen.[...]</SerieBeschreibung>
    <Bemerkung/>
    <Bewertung>4.25</Bewertung>
    <AnzBewertungen>125</AnzBewertungen>
    <ErsteAusstrahlung/>
    <Schauspieler/>
    <SerieStatus>Ended</SerieStatus>
  </Series>
</Data>

SQL Befehl zum importieren:
Code:
Load XML 
Local infile 'C:\\Temp\\test.xml' 
into table Serie
rows identified by '<Series>'


Wie geschrieben funktioniert der Import korrekt, wenn ich die Empty Tags ersetze. Siehe hier:
Code:
<Bemerkung/>
<ErsteAusstrahlung/>
<Schauspieler/>
durch:
Code:
<Bemerkung></Bemerkung>
<ErsteAusstrahlung></ErsteAusstrahlung>
<Schauspieler></Schauspieler>


Output mit EmptyTags:
id: 0
SerieName: ""
SerieBeschreibung: ""
Bemerkung: null
Bewertung: 0
AnzBewertungen: 0
ErsteAusstrahlung: null
Schauspieler: null

SerieStatus: Ended

Output ohne EmptyTags:
id: 1
SerieName: Fargo
SerieBeschreibung: Im Januar 2006 kommt Lorne Malvos Auto in Bemidji, Minnesota nach einem Zusammenstoß mit einem Reh zum Liegen.[...]
Bemerkung: null
Bewertung: 4.25
AnzBewertungen: 125
ErsteAusstrahlung: null
Schauspieler: null
SerieStatus: Ended


Ich hoffe ihr könnt mir weiterhelfen. Falls ihr noch weitere Angaben bräuchtet kann ich diese gerne noch nachreichen.

Gruss
Nebuk
 
Ok, danke für den Input. Daran wird es liegen, habe nämlich eine frühere Version. Ich schau es mir mal an.

Gruss
Nebuk
Ergänzung ()

ok, Nachtrag:
So wie es aussieht hat sich das Problem mit dem Update behoben. Danke für den Hinweis :)
 
Zurück
Oben