| Tweet |
XML-Datei in MySQL-Datenbank schreiben
-
Heute mal wieder ein kleines Codeschnipsel von mir
:
Heutzutage gibt es viele gute Softwarewelche sehr flexibel mit eigenen Scripten zusammen arbeiten. Als Schnittstelle dienen dort meistens ganz einfache XML-Dateien welche von der Software oder anderen Programmen erzeugt werden. Diese beinhalten dann verschiedene Werte und müssen für die Weiterverarbeitung an einem zentralen Platz gespeichert werden. Was eignet sich da besser als eine Datenbank?
. Einmal eingespeichert kann man die Daten schnell und einfach per SQL-Befehl abarbeiten und ersparrt sich dadurch einiges an Rechenleistung beim Lesen der .xml-Datei. Aber wie verarbeitet man denn nun die Datei, damit man diese einfach in die Datenbank schreiben kann? Hier habe ich mal eine Beispiel-Datei namens “Artikel.xml” für euch erstellt:
1 2 3 4 5 6 7 8
<?xml version="1.0" encoding="utf-8"?> <Artikelstamm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Artikel id="1" artnummer="1000" bezeichnung="Testprodukt1" /> <Artikel id="2" artnummer="11000" bezeichnung="Testprodukt2" /> <Artikel id="3" artnummer="11001" bezeichnung="Testprodukt3" /> <Artikel id="4" artnummer="11002" bezeichnung="Testprodukt4" /> <Artikel id="5" artnummer="11003" bezeichnung="Testprodukt5" /> </Artikelstamm>
Wie ihr seht ein ganz normaler xml-Aufbau mit verschiedenen Parametern in den einzelnen Datensätzen, welche wir nun versuchen müssen in die Datenbank zu bekommen. Die einzige Funktion welche man für den Aufruf der Datei zum verarbeiten kennen muss ist simplexml_load_file($filename). Die Funktion kann man dann ganz einfach einer Variable (z.B. $xml) zuweisen und mit ihr arbeiten.So würde der Code dann aussehen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
<?php $filename = './itrunde/Artikel.xml'; if(file_exists($filename)) { $xml = simplexml_load_file($filename); if($xml) { foreach($xml->Artikel AS $article) { $abfrage = "INSERT INTO xml_itrunde (id, artikelnummer, bezeichnung) VALUES ('".$article['id']."', '".$article['artnummer']."', '".$article['bezeichnung']."')"; $ergebnis = mysql_query($abfrage); } } } ?>
Man sieht sofort, dass es eigentlich relativ easy ist die Attribut-Inhalte in die Datenbank zu schmeißen. Vergessen dürft ihr natürlich nicht die Datenbank-Verbindung herzustellen und die (hier in meinem Beispiel) drei Spalten in der Tabelle xml_itrunde einzutragen
. Meinen einfachen Codeschnipsel kann man auf jede XML-Datei anwenden, ersparrt bestimmt so einigen von euch eine Menge Sucharbeit. Wichtig wäre noch zu wissen, dass die Zeichenkodierung von der XML-Datei utf-8 sein sollte, sonst kann es mit dem Script zu Problemen kommen (selbst getestet
). Standardmäßig sollte jede Software jedoch utf-8 ausgeben, somit sollte es zu keinen weiteren Problemen kommen.Wenn euch die Datei z.B. wie bei mir alle 30min aktualisiert wird, solltet ihr anstatt des INSERT-Befehles die Tabelle Updaten oder diese vorher per TRUNCATE-Befehl leeren und dann erst neu beschreiben lassen. Per Cron-Job ist es dann kein Problem mehr das Script alle halbe Stunde automatisch ausführen zu lassen!
Viel Spaß beim ausprobieren, Fragen werden gerne beantwortet!
Tweet








14.02.2011 um 20:24 Uhr
und jetzt mach das ganze mal in Java und du weißt was ich momentan fürn Problem hab >.>
14.02.2011 um 20:42 Uhr
Wodran scheitert es denn?
Kannst uns ja deinen bisherigen Code posten, damit wir dir helfen können bzw. nachher den fertigen Code präsentieren, damit die Leser nicht mehr so lange suchen müssen
.
14.02.2011 um 23:00 Uhr
http://www.java-tips.org/java-se-tips/javax.xml.parsers/how-to-read-xml-file-in-java.html
Isn bisschen mehr Code, klar… aber wo ist das Problem? Und zum speichern in die DB gibts auch gute Anbindung (z.B. JDBC).
14.02.2011 um 23:26 Uhr
jetz ma nich so’n stress hier xDD
geht schon xD
14.02.2011 um 23:30 Uhr
Vor genau einem Monat stande ich vor diesem Problem! Im Internet gibt es fast nichts dadrüber (Zumindest nicht so einen einfachen und genialen Codeschnipsel wie hier
), dankeschön!
Hatte eigentlich schon aufgegeben, kann jetzt aber wieder am alten Projekt weiterarbeiten
18.02.2011 um 01:33 Uhr
Sehr geiler Codeschnipsel, ich habe mir heute den Wolf gesucht und alles mögliche ausprobiert, klappte aber gar nichts
. Dein Script angepasst und klappte sofort! Bin begeistert, danke
!
Eine Frage aber noch: Meine xml-Datei ist wie du schon sagst uft-8, in der Datenbank benutze ich für die Spalten “latin1_german1_ci”. Die Umlaute werden nun aber leider falsch dargestellt: “ü, ä”.
Ich hoffe du kannst mir auch dabei helfen, dann rettest du mir echt die Woche
18.02.2011 um 01:36 Uhr
Ist kein großes Problem, setze mal hinter die erstellte Datenbankverbindung folgenden Befehl:
Die Umlaute sollten nun richtig in der Datenbank gespeichert werden
. Viel Spaß damit!
19.02.2011 um 01:34 Uhr
Einfach Genial, vorhin eingesetzt und klappt! Vielen Dank, super Seite, ist abonniert und wird weiter empfohlen!!!!
15.04.2011 um 09:48 Uhr
Hallo,
vielen Dank für das nützliche Tutorial, welches mich meinen Ziel eine bestimmte XML Datei einzulesen, schon bedeutend näher gebracht hat. Ich hänge nur noch an folgendem Problem fest:
Wenn in deinem Beispiel mehrere Artikelstämme hintereinander wären, wie kann man diese in einer Schleife durchlaufen lassen? Mit foreach ($xml->artikelstamm as $reihe) klappt es nicht.
Meine XML ist in etwa so aufgebaut:
Genaugenommen liest er ein solche XML bei mir gar nicht erst ein.
Vielen Dank im Voraus!
15.04.2011 um 09:52 Uhr
Oh, ich habe es gerade selbst rausgefunden. Manchmal muss man ein Problem nur aufschreiben, um es lösen zu können. Ich muss einfach einen weiteren Tag drum rum machen.
Also wegen mir, kannst die beiden Kommentare wieder löschen. Nichts für ungut.
01.10.2011 um 22:34 Uhr
hallo
ist sher schöne
vielen lieben dank
13.02.2012 um 22:32 Uhr
Ich hexe gerade an einem komplexeren Script herum und habe echte Probleme mit der Zeichencodierung. Ich bekomme die Daten in der XML Datei angeliefert, ohne dass anfangs die Zeichencodierung genannt wird. Ich gehe aber von UTF-8 aus. Die Daten spiele ich in eine MySQL Datenbank ein, die dann meine Webseite füttert. Beispieldaten:
Die Optik ist betont dezent gehalten in weiß und die Breite liegt bei 2′
Die Problematik wird sicherlich schon klar: Sonderzeichen, Umlaute, Gänsefüßchen. Ich muss die Datensätze regelmäig aktualisieren, aber zerschießt mir die Daten völlig, daher habe ich utf8_decode () probiert. Dabei werden dann einige Datensätze einfach übersprungen. Vermutlich die mit Sonderzeichen. Zusätzlich habe ich dann noch htmlspecialchars () probiert – das funzt dann bei allen Artikeln, aber die HTML-Formatierung wird dann als Nur-Text mit abgespeichert. Ich hexe da schon seit 3 Wochen dran herum und komme nicht weiter. Gibts einen Tipp?
13.02.2012 um 22:34 Uhr
Hmmm… HTML Tags werden in den Kommentaren wohl auch herausgefiltert… br als Zeilenumbrüche, ß, ä, ‘, ” Das sind die Problemfaktoren.
14.02.2012 um 14:23 Uhr
Probiere es mal mit
Hat mir schon oft geholfen Daten passend in die DB zu schreiben bzw. ohne Umlautprobleme auszulesen
!
13.11.2012 um 18:14 Uhr
da Ich das vergnügen habe mit stets veralteten Hosts zu arbeiten wo mysql Version sonstwas.steinzeit läuft und die alle noch kein ExtractValue kennen kann Ich hier nur eines sagen:
DANKE!!!!!
15.02.2013 um 11:49 Uhr
hallo. ein sehr schönes u. nützliches Tutorial. ich hätte es aber genau umgekehrt. Und zwar steht in einer sql-Tabelle namens ‘Autor’, die Spalten Name und Url, die auch belegt sind mit Informationen. Es existiert eine XML-Datei namens AutorenInfo.xml:
Wie bekomme ich die Information, die sich in der Tabelle “Autor” befindet in die AutorenInfo.xml? Ihr würdet mir sehr helfen. Ich suche schon seit Wochen das Problem zu lösen. DANKE im voraus.
01.04.2013 um 03:45 Uhr
hallo
das ist sher guttttttttttt
schöne Gruß dank
03.05.2013 um 14:37 Uhr
Hallo Leute!
Mein Problem: ein Gerät speichert die letzten Daten (alle 2 Mintuten aktualisiert) als XML file ab (temperatur). Die xml file ist unter einer Netzwerkadresse(http://“ip des Temperaturloggers”/xmlfeed.rb) erreichbar.
Die Frage Dazu: wie kann ich die Daten in eine Datenbank bringen bzw. wo muss ich den Code einbetten??
Danke!