Facebook Button Twitter Button YouTube Button RSS Button

IT-Runde



XML-Datei in MySQL-Datenbank schreiben

  • XML-Datei in MySQL-Datenbank schreiben

    Heute mal wieder ein kleines Codeschnipsel von mir :D :
    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 :D ). 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! :D


  1. #1 BlackChester
    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 >.>

    Post ReplyPost Reply
  2. #2 Christian
    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 ;) .

    Post ReplyPost Reply
  3. #3 digilist
    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).

    Post ReplyPost Reply
  4. #4 BlackChester
    14.02.2011 um 23:26 Uhr

    jetz ma nich so’n stress hier xDD
    geht schon xD

    Post ReplyPost Reply
  5. #5 Francesco
    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 :D ), dankeschön!

    Hatte eigentlich schon aufgegeben, kann jetzt aber wieder am alten Projekt weiterarbeiten :P

    Post ReplyPost Reply
  6. #6 Leonard
    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 :D !

    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 :D

    Post ReplyPost Reply
  7. #7 Christian
    18.02.2011 um 01:36 Uhr

    Ist kein großes Problem, setze mal hinter die erstellte Datenbankverbindung folgenden Befehl:

    1
    
    mysql_set_charset("utf8");

    Die Umlaute sollten nun richtig in der Datenbank gespeichert werden ;) . Viel Spaß damit!

    Post ReplyPost Reply
  8. #8 Leonard
    19.02.2011 um 01:34 Uhr

    Einfach Genial, vorhin eingesetzt und klappt! Vielen Dank, super Seite, ist abonniert und wird weiter empfohlen!!!! :D

    Post ReplyPost Reply
  9. #9 Frederik
    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!

    Post ReplyPost Reply
  10. #10 Frederik
    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.

    Post ReplyPost Reply
  11. #11 hana
    01.10.2011 um 22:34 Uhr

    hallo

    ist sher schöne

    vielen lieben dank

    Post ReplyPost Reply
  12. #12 birk
    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?

    Post ReplyPost Reply
  13. #13 birk
    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.

    Post ReplyPost Reply
  14. #14 Christian
    14.02.2012 um 14:23 Uhr

    Probiere es mal mit

    1
    2
    3
    4
    5
    6
    7
    
    // Speichern/Ausgeben von Strings ohne Umlautprobleme - IT-Runde.de
    $char_table = array_diff(
      get_html_translation_table(HTML_ENTITIES,ENT_NOQUOTES),
      get_html_translation_table(HTML_SPECIALCHARS,ENT_NOQUOTES)
    );
     
    echo strtr($string, $char_table);

    Hat mir schon oft geholfen Daten passend in die DB zu schreiben bzw. ohne Umlautprobleme auszulesen ;) !

    Post ReplyPost Reply
  15. #15 Rene
    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!!!!!

    Post ReplyPost Reply
  16. #16 Mielan
    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.

    Post ReplyPost Reply
  17. #17 markos
    01.04.2013 um 03:45 Uhr

    hallo
    das ist sher guttttttttttt
    schöne Gruß dank

    Post ReplyPost Reply
  18. #18 David
    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!

    Post ReplyPost Reply
Kommentar schreiben