LOAD XML LOCAL INFILE mit inkonsistenten Spaltennamen

7

MySQL hat eine nette Aussage: LOAD XML LOCAL INFILE

Zum Beispiel, wenn Sie diese Tabelle haben:

%Vor%

und die folgende XML-Datei namens person.xml:

%Vor%

Sie können dies tun:

%Vor%

Meine Frage ist, was ist, wenn die Spaltennamen in der XML-Datei anders sind als in der Tabelle? Zum Beispiel:

%Vor%

Wie können Sie dasselbe mit einer MySQL-Anweisung erreichen, ohne die XML-Datei zu manipulieren? Ich habe überall gesucht, konnte aber keine Antwort finden.

    
stepanian 20.12.2011, 22:32
quelle

5 Antworten

4

Folgende Optionen standen mir zur Verfügung:

Option 1: Erstellen Sie eine temporäre Tabelle mit verschiedenen Feldnamen (wie von den anderen Antworten vorgeschlagen). Dies wäre ein zufriedenstellender Ansatz gewesen. Als ich es jedoch ausprobierte, tauchte ein neues Problem auf: Die LOAD XML-Anweisung akzeptiert aus irgendeinem Grund keine leeren Elemente im minimierten Format (z. B. <person /> ). Die Anweisung ist daher fehlgeschlagen, da die XML-Dateien, die gelegentlich geladen werden müssen, leere Elemente in diesem Format enthalten.

Option 2: Transformieren Sie die XML-Datei mit XSLT, bevor Sie die Anweisung LOAD XML ausführen, um die Elementnamen zu ändern und die leeren Elementformate zu ändern. Dies war nicht praktikabel, da die XML-Dateien sehr groß sind und XSLT-Verarbeitungsmodule das gesamte XML vor der Verarbeitung in den Speicher laden.

Option 3: Überbrücken Sie die LOAD-XML-Anweisung vollständig und verwenden Sie einen SAX-Parser, um die XML-Datei zu analysieren und die Datensätze mithilfe von JDBC und vorbereiteten Anweisungen direkt in die Datenbank einzufügen. Obwohl rohe JDBC und vorbereitete Anweisungen im Allgemeinen effizient sind, erwies sich dies als zu langsam. Viel langsamer als die LOAD XML-Anweisung.

Option 4: Verwenden Sie die LOAD DATA-Anweisung anstelle der LOAD-XML-Anweisung und spielen Sie mit den optionalen Klauseln, die mit dieser Anweisung verknüpft sind, um meine Anforderungen zu erfüllen (z. B. Zeilen, die durch usw. getrennt sind). Dies hätte funktionieren können, wäre aber fehleranfällig und instabil gewesen.

Option 5: Analysieren Sie die Datei mit einem schnellen Nur-Vorwärts-Parser und lesen / schreiben Sie gleichzeitig XML-Elemente und generieren Sie eine neue XML-Datei mit den geänderten Namen im gewünschten Format für die LOAD XML-Anweisung.

Am Ende habe ich Option 5 verwendet. Ich habe die Java Streaming API für XML (StAX) sowohl zum Lesen der XML-Datei als auch zum Erzeugen der modifizierten XML-Datei verwendet und dann LOAD XML LOCAL INFILE über JDBC von der Webanwendung aus ausgeführt. Es funktioniert perfekt und es ist super schnell.

    
stepanian 28.12.2011, 08:20
quelle
10

Die Felder in der XML-Datei, die nicht den physikalischen Spaltennamen entsprechen, werden ignoriert. Und Spalten in der Tabelle, die keine entsprechenden Felder im XML haben, werden auf NULL gesetzt.

Was ich tun würde, wird in eine temporäre Tabelle geladen, wie @Kolink es vorschlägt, aber mit zusätzlichen Spalten. Fügen Sie beim Laden der Daten aus XML eine SET -Klausel hinzu.

%Vor%

Kopieren Sie dann in die reale Tabelle und wählen Sie eine Teilmenge der Spalten aus.

%Vor%

Alternativ können Sie die zusätzlichen Spalten löschen und SELECT * verwenden.

%Vor%     
Bill Karwin 23.12.2011 22:16
quelle
4

Ein bisschen hacky, aber funktionierende Lösung mit dem guten alten LOAD DATA INFILE :

%Vor%

P.S. Wahrscheinlich müssen Sie zusätzlich mit dem Feldtrennzeichen spielen, wenn die Daten Kommas enthalten.

    
newtover 27.12.2011 09:45
quelle
2

Sie könnten eine temporäre Tabelle mit den Spaltennamen aus der XML-Datei erstellen (obwohl dies manuell in der create temporary table -Abfrage durchgeführt werden müsste), laden Sie die XML-Datei in diese Tabelle und dann insert into person select * from tmp_table_name .

    
Niet the Dark Absol 23.12.2011 21:53
quelle
1

Mysql-Tabellenschema: Organisationstyp (ID, Name)

Organisationstyp.xml:

%Vor%

und die mysql-Importabfrage sieht so aus:

%Vor%     
Gustik 07.02.2018 03:46
quelle

Tags und Links