1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Externe XML-Datei auslesen und mit PHP in Mysql DB Schreiben (ausführen per Cronjob)

Dieses Thema im Forum "XML Technologien" wurde erstellt von gixnetwork, 6. Oktober 2013.

  1. gixnetwork

    gixnetwork Mitglied

    Hallo

    Ich benötige jede minute die aktuellen wetterdaten von verschiedenen Servern, die in eine Mysql DB Geschriben werden.

    Die heutige unelegante Lösung ist diese:

    Code (Text):
    1. <?php
    2. mysql_connect("79.170.44.121", "XXXXXXXX", "XXXXXX");
    3. mysql_select_db("XXXXXXXX");
    4. mysql_query("INSERT INTO idX (dateid, date, time, temp, taupunkt, feuchte, luftdruck, windchill, windgesch, windbohe, winddir, regen) VALUES
    5. (12345, 12345, 3444, 444,555, 3333, 55555, 1234, 3333, 444, 4444) ");
    6.  
    7. ?>
    Die Values (Wetter-Messwerte) werden von einem programm automatisch eingefügt.

    So kann ich von mehreren verschidenen servern daten in eine Mysql DB Schreiben. vorausgesetzt jeder server unterstüzt php!

    -----------------------------------

    Ich Möchte das "umbauen". Externe XML-Datei auslesen und mit PHP in Mysql DB Schreiben


    Die XML Datei sie so aus: (selbstgeschrieben, inhalt kann frei verändert werden falls dann einfacher zum auslesen ist.)

    Code (Text):
    1. <?xml version="1.0" encoding="ISO-8859-1" ?>
    2. <content>
    3. <ws_dateid>201310061609</ws_dateid>
    4. <ws_date>2013-10-06</ws_date>
    5. <ws_time>16:09</ws_time>
    6. <ws_temp>16.0</ws_temp>
    7. <ws_taupunkt>12.4</ws_taupunkt>
    8. <ws_feuchte>79</ws_feuchte>
    9. <ws_luftdruck>1021.8</ws_luftdruck>
    10. <ws_windchill>16.0</ws_windchill>
    11. <ws_windgesch>1.3</ws_windgesch>
    12. <ws_windbohe>3.9</ws_windbohe>
    13. <ws_winddir>67</ws_winddir>
    14. <ws_regen>0.0</ws_regen>
    15. </content>
    Und mit diesem Code kann ichs zumindest mal auslesen und in ein array unwandeln (value ist glaub besser): (gefunden durch google)

    Code (Text):
    1. <?php
    2. function objectsIntoArray($arrObjData, $arrSkipIndices = array())
    3. {
    4. $arrData = array();
    5.  
    6. // if input is object, convert into array
    7. if (is_object($arrObjData)) {
    8. $arrObjData = get_object_vars($arrObjData);
    9. }
    10.  
    11. if (is_array($arrObjData)) {
    12. foreach ($arrObjData as $index => $value) {
    13. if (is_object($value) || is_array($value)) {
    14. $value = objectsIntoArray($value, $arrSkipIndices); // recursive call
    15. }
    16. if (in_array($index, $arrSkipIndices)) {
    17. continue;
    18. }
    19. $arrData[$index] = $value;
    20. }
    21. }
    22. return $arrData;
    23. }
    24. ?>
    25.  
    26. Ausgabe:
    27.  
    28. <?php
    29. $xmlUrl = "wswin-xml-wettermap.xml"; // XML feed file/URL
    30. $xmlStr = file_get_contents($xmlUrl);
    31. $xmlObj = simplexml_load_string($xmlStr);
    32. $arrXml = objectsIntoArray($xmlObj);
    33. print_r($arrXml);
    34. ?>

    -----------------------------------------

    Aber Wie kommt das jetzt in die Mysql DB?

    Habe sehr sehr viell gegooglet aber jedes xml ist anders, und jeder versucht es auf eine andere art.

    Vermutlich ist das xml von mit komplet falsch "codiert", ich muss xml wählen weill txt nicht auslesen kann.

    Habe leider wenig ahnung von php und nochweniger von xml.

    Bitte um eine Fertigen code oder hinweise zu tutorials. Ich weiss ist viell verlang und nicht gerade erwünscht nach vertigen codes zu Fragen.

    Binn am verzweifeln, krigs einfach nicht hin.

    Ps. Rechtschaibefehler sind mir schnurz pipe! Geschrieben mit Maus und Bildschirmtastatur.

    Danke für jeden tip
     
  2. alxy

    alxy Erfahrenes Mitglied

    Ich verstehs nicht so recht, was du jetzt machen willst.
    Ich würde allerdings mal JSON probieren anstatt XML, da kannst du mittels json_encode gleich alles in ein array verwandeln.
     
  3. gixnetwork

    gixnetwork Mitglied

    Ich möchte XML datei-inhalt von servern 1,2,3,4.... auf den Main Server in eine Mysql Datenbank Speichern. und das minütlich.

    Ohne FTP
     
  4. gixnetwork

    gixnetwork Mitglied

    1.jpg
    Grafische Info
     
  5. deepthroat

    deepthroat Erfahrenes Mitglied

    Hi.

    Das ist das falsche Forum. Siehe http://www.tutorials.de/xml-technologien/316505-erst-hier-lesen-dann-hier-posten.html

    Ansonsten würde ich alxy recht geben, XML scheint mir nur bedingt geeignet zu sein für dein Problem. JSON oder sogar einfach eine CSV Datei würde auch ausreichen...

    XML bläht den Inhalt ziemlich auf und ist komplizierter zu Verarbeiten. Und vermutlich wird sich dein Datenschema in Zukunft kaum ändern, so dass dieser Vorteil von XML auch wegfällt.

    Falls du einfach CSV Dateien auslieferst mußt du noch nicht mal irgendwas mit PHP skripten: Datei runterladen mit wget oder curl, dann mysqlimport aufrufen. Den Cronjob zu schreiben dauert vermutlich gerade mal 5 Minuten...
     
  6. gixnetwork

    gixnetwork Mitglied

    Hier ist meine Lösung:

    Code (Text):
    1. <!-- %customfile=c:\wswin\html\xml-wettermap.xml% -->%ws_delline%
    2. <!-- %openfile=wswin-NEXT.txt% -->%ws_delline%
    3. %unit_off%<?xml version='1.0'?>
    4. <data>
    5. <entry>
    6. <dateid>%ws_year%%ws_month2%%ws_day2%%ws_hour2%%ws_minute2%</dateid>
    7. <date>%ws_year%-%ws_month2%-%ws_day2%</date>
    8. <time>%ws_hour2%:%ws_minute2%</time>
    9. <temp>%curval[2]%</temp>
    10. <taupunkt>%curval[43]%</taupunkt>
    11. <feuchte>%curval[18]%</feuchte>
    12. <luftdruck>%curval[33]%</luftdruck>
    13. <windchill>%curval[44]%</windchill>
    14. <windgesch>%curval[35]%</windgesch>
    15. <windbohe>%curval[45]%</windbohe>
    16. <winddir>%curval[36]%</winddir>
    17. <regen>%curval[34]%</regen>
    18. </entry>
    19. </data>
    und zum eintragen in mysql:

    Code (Text):
    1. <?
    2.  
    3. global $element, $entry;
    4. $entry = array();
    5.  
    6. function openElement( $parser, $tagName, $attrs )
    7. {
    8.     global $element;
    9.     $element = $tagName;
    10. }
    11.  
    12. function cData( $parser, $data )
    13. {
    14.     global $element, $entry;
    15.    
    16.     if( ( $element != 'entry' ) && ( $element != 'data' ) )
    17.         $entry[$element] .= $data;
    18. }
    19.  
    20. function closeElement( $parser, $tagName )
    21. {
    22.     global $entry;
    23.  
    24.     if( $tagName == 'entry' )
    25.     {
    26.         // prepare sql query
    27.         while( list( $key, $value ) = each( $entry ) )
    28.         {
    29.             $fields .= "$key, ";
    30.             $values .=  "'$value', ";
    31.         }
    32.        
    33.         // remove trailing characters
    34.         $fields = substr( $fields, 0, strlen( $fields ) - 2 );
    35.         $values = substr( $values, 0, strlen( $values ) - 2 );
    36.  
    37.         // remove all non-visible characters except SP, LF and CR.
    38.         $values = preg_replace( '/[^\x20-\xFF\x0A\x0D]/', '', $values );
    39.        
    40.         // build sql query
    41.         $query = "INSERT INTO XY VALUES ($values)";
    42.         print "$query
    43. \n";
    44.          
    45.         // insert data
    46.         $result = mysql_query( $query )
    47.             or die( "DB ERROR: query failed: $query" );
    48.  
    49.         // empty array
    50.         $entry = array();
    51.     }
    52. }
    53.  
    54. // open connection and select database
    55. $link = mysql_connect( '223.422.44.432', 'xxxxxxxxxxx', 'xxxxxxxxxxxxxx' )
    56.      or die( 'DB ERROR: could not connect to database!' );
    57.  
    58. mysql_select_db( 'webweb' ) or die( 'DB ERROR: could not select database' );
    59.  
    60. // create instance of xml parser
    61. $parser = xml_parser_create();
    62.  
    63. // do not uppercase all element identifiers
    64. xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
    65.  
    66. // element handlers
    67. xml_set_element_handler( $parser, 'openElement', 'closeElement' );
    68.  
    69. // cdata handler
    70. xml_set_character_data_handler( $parser, 'cData' );
    71.  
    72. // open data file
    73. if (! ( $fp = fopen( 'http://www.wetterstation-weingarten.ch/html/mysql/wswin-xml-wettermap.xml', 'r' ) ) )
    74.     die( 'ERROR: could not open file!' );
    75.  
    76.  
    77. // read data line by line
    78. while( !feof( $fp ) )
    79. {
    80.     // parse data line by line (without trailing \n)
    81.     if( !xml_parse( $parser, chop( fgets( $fp ) ) ) )
    82.         die(  'XML ERROR: ' .
    83.             xml_error_string( xml_get_error_code( $parser ) ) . ' in line ' .
    84.             xml_get_current_line_number( $parser )
    85.         );
    86. }
    87.  
    88. // close data file
    89. fclose( $fp );
    90.  
    91. // remove instance of xml parser
    92. xml_parser_free( $parser );
    93.  
    94. // close database connection
    95. mysql_close( $link );
    96.  
    97. ?>
    Ta da.........

    hofe jemand kans gebrauchen!
     
Die Seite wird geladen...