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



## gixnetwork (6. Oktober 2013)

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:


```
<?php
mysql_connect("79.170.44.121", "XXXXXXXX", "XXXXXX");
mysql_select_db("XXXXXXXX");
mysql_query("INSERT INTO idX (dateid, date, time, temp, taupunkt, feuchte, luftdruck, windchill, windgesch, windbohe, winddir, regen) VALUES
(12345, 12345, 3444, 444,555, 3333, 55555, 1234, 3333, 444, 4444) ");

?>
```

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.)


```
<?xml version="1.0" encoding="ISO-8859-1" ?>
<content>
<ws_dateid>201310061609</ws_dateid>
<ws_date>2013-10-06</ws_date>
<ws_time>16:09</ws_time>
<ws_temp>16.0</ws_temp>
<ws_taupunkt>12.4</ws_taupunkt>
<ws_feuchte>79</ws_feuchte>
<ws_luftdruck>1021.8</ws_luftdruck>
<ws_windchill>16.0</ws_windchill>
<ws_windgesch>1.3</ws_windgesch>
<ws_windbohe>3.9</ws_windbohe>
<ws_winddir>67</ws_winddir>
<ws_regen>0.0</ws_regen>
</content>
```

Und mit diesem Code kann ichs zumindest mal auslesen und in ein array unwandeln (value ist glaub besser): (gefunden durch google)


```
<?php
function objectsIntoArray($arrObjData, $arrSkipIndices = array())
{
$arrData = array();

// if input is object, convert into array
if (is_object($arrObjData)) {
$arrObjData = get_object_vars($arrObjData);
}

if (is_array($arrObjData)) {
foreach ($arrObjData as $index => $value) {
if (is_object($value) || is_array($value)) {
$value = objectsIntoArray($value, $arrSkipIndices); // recursive call
}
if (in_array($index, $arrSkipIndices)) {
continue;
}
$arrData[$index] = $value;
}
}
return $arrData;
}
?>

Ausgabe:

<?php
$xmlUrl = "wswin-xml-wettermap.xml"; // XML feed file/URL
$xmlStr = file_get_contents($xmlUrl);
$xmlObj = simplexml_load_string($xmlStr);
$arrXml = objectsIntoArray($xmlObj);
print_r($arrXml);
?>
```


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

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


----------



## alxy (6. Oktober 2013)

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.


----------



## gixnetwork (6. Oktober 2013)

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


----------



## gixnetwork (6. Oktober 2013)

Grafische Info


----------



## deepthroat (16. Oktober 2013)

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...


----------



## gixnetwork (16. Oktober 2013)

Hier ist meine Lösung:


```
<!-- %customfile=c:\wswin\html\xml-wettermap.xml% -->%ws_delline%
<!-- %openfile=wswin-NEXT.txt% -->%ws_delline%
%unit_off%<?xml version='1.0'?>
<data>
<entry>
<dateid>%ws_year%%ws_month2%%ws_day2%%ws_hour2%%ws_minute2%</dateid>
<date>%ws_year%-%ws_month2%-%ws_day2%</date>
<time>%ws_hour2%:%ws_minute2%</time>
<temp>%curval[2]%</temp>
<taupunkt>%curval[43]%</taupunkt>
<feuchte>%curval[18]%</feuchte>
<luftdruck>%curval[33]%</luftdruck>
<windchill>%curval[44]%</windchill>
<windgesch>%curval[35]%</windgesch>
<windbohe>%curval[45]%</windbohe>
<winddir>%curval[36]%</winddir>
<regen>%curval[34]%</regen>
</entry>
</data>
```

und zum eintragen in mysql:


```
<?

global $element, $entry;
$entry = array();

function openElement( $parser, $tagName, $attrs )
{
	global $element;
	$element = $tagName;
}

function cData( $parser, $data )
{
	global $element, $entry;
	
	if( ( $element != 'entry' ) && ( $element != 'data' ) )
		$entry[$element] .= $data;
}

function closeElement( $parser, $tagName )
{
	global $entry;

	if( $tagName == 'entry' )
	{
		// prepare sql query
		while( list( $key, $value ) = each( $entry ) )
		{
			$fields .= "$key, ";
			$values .=  "'$value', ";
		}
		
		// remove trailing characters
		$fields = substr( $fields, 0, strlen( $fields ) - 2 );
		$values = substr( $values, 0, strlen( $values ) - 2 );

		// remove all non-visible characters except SP, LF and CR.
		$values = preg_replace( '/[^\x20-\xFF\x0A\x0D]/', '', $values );
		
		// build sql query
		$query = "INSERT INTO XY VALUES ($values)";
		print "$query
\n";
		 
		// insert data
		$result = mysql_query( $query )
			or die( "DB ERROR: query failed: $query" );

		// empty array
		$entry = array();
	}
}

// open connection and select database
$link = mysql_connect( '223.422.44.432', 'xxxxxxxxxxx', 'xxxxxxxxxxxxxx' )
	 or die( 'DB ERROR: could not connect to database!' );

mysql_select_db( 'webweb' ) or die( 'DB ERROR: could not select database' );

// create instance of xml parser
$parser = xml_parser_create();

// do not uppercase all element identifiers
xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );

// element handlers
xml_set_element_handler( $parser, 'openElement', 'closeElement' );

// cdata handler
xml_set_character_data_handler( $parser, 'cData' );

// open data file
if (! ( $fp = fopen( 'http://www.wetterstation-weingarten.ch/html/mysql/wswin-xml-wettermap.xml', 'r' ) ) )
 	die( 'ERROR: could not open file!' );


// read data line by line
while( !feof( $fp ) )
{
	// parse data line by line (without trailing \n)
	if( !xml_parse( $parser, chop( fgets( $fp ) ) ) )
		die(  'XML ERROR: ' .
			xml_error_string( xml_get_error_code( $parser ) ) . ' in line ' .
			xml_get_current_line_number( $parser )
		);
}

// close data file
fclose( $fp );

// remove instance of xml parser
xml_parser_free( $parser );

// close database connection
mysql_close( $link );

?>
```

Ta da.........

hofe jemand kans gebrauchen!


----------

