# Externes XML auslesen und in MySql DB speichern



## nafets (11. Mai 2009)

Hallo

Ich versuche seit langem ein XML in eine MySQL zu speichern. Hier meine Ausgangslage. Es handelt sich um das aktuelle Kinoprogramm welches jede Woche vom Hauptsystem (Rechner im Haus) erstellt wird. Dieser erstellt dann ein XML-File mit allen benötigten Daten.

Nun möchte ich diese Daten gerne auf dem externen Webserver verwenden (Hompage). Dazu sollte ich die Daten in meiner MySQL DB speichern können, damit ich diese so verwenden und darstellen kann wie ich möchte. Aber ich kriegs einfach nicht hin. Habe schon diverse Parser und sonstige Codeschnispel aus google etc. ausprobiert. Kommen immer wieder Fehler wegen Zugriff etc. 

Nun ich bin voll neu im XML-Land und stehe daher voll auf dem Schlauch. Kann mir bitte jemand einen einfach Ansatz geben wie ich das anstellen muss?

Hier mal der Link zum XML
http://ticketonline.sterk.ch/seatplan/192.168.207.15_2603_100008_shows.xml

Also nochmals zum das klarstellen. Wie kann ich jetzt diese XML, auf welches ich auch nur so zugreifen kann auf einem externen Webserver mit PHP in eine MySQL DB speichern?

Vielen Dank im Voraus für eure Inputs.

Gruss


----------



## kuddeldaddeldu (11. Mai 2009)

Hi,



nafets hat gesagt.:


> Habe schon diverse Parser und sonstige Codeschnispel aus google etc. ausprobiert. Kommen immer wieder Fehler wegen Zugriff etc.
> 
> Nun ich bin voll neu im XML-Land und stehe daher voll auf dem Schlauch. Kann mir bitte jemand einen einfach Ansatz geben wie ich das anstellen muss?



na ja, ich fürchte, das wird dann wieder nur ein Codeschnipsel, der Dir nicht hilft. Hier weiß ja niemand, was Du schon probiert hast. Vielleicht postest Du einfach mal Deinen eigenen Ansatz und beschreibst, welche Probleme dabei auftreten.

LG


----------



## nafets (12. Mai 2009)

Hallo

Ja leider habe ich nicht viel bzw. einen grossen Teil schon wieder gelöscht, da ich das Thema beiseite gelegt hatte und es ja nicht funktionierte. Nun möchte ich es aber doch noch umsetzen. 

Ich brauche einfach mal einen Ansatz oder ein Muster wie so was geht. Ich versuche es natürlich weiterhin via Google aber vielleicht machts mir ja jemand etwas einfacher.


----------



## DeluXe (12. Mai 2009)

Wie du an das XML kommst sollte mit den Stichworten "php rss feed auslesen" groß und breit erklärt werden.

Und genau so wirst du auch Beispiele zu einen XML-Parser für PHP finden können. 

Wenn du ein konkretes Problem hast, können wir dir gerne weiterhelfen. Nur können wir nicht die ganze Funktionsweise erklären, damit du weisst wie man so etwas umsetzt und wonach du suchen musst.


----------



## kuddeldaddeldu (12. Mai 2009)

Hi,

dann beschreib uns doch mal, welcher Teil der Aufgabe denn überhaupt Probleme bereitet. Wie Du Daten in eine MySQL-DB schreibst, weisst Du? Wie Du die Daten vom Server holen kannst, weisst Du? Ist nur das Parsen des XMLs ein Problem?



nafets hat gesagt.:


> Habe schon diverse Parser und sonstige Codeschnispel aus google etc. ausprobiert. Kommen immer wieder Fehler wegen Zugriff etc.



Haben Deine bereits getesteten Parserlösungen vielleicht nur das Problem, dass das Abholen der Daten wegen Deiner Serverkonfiguration nicht funktioniert? Dann könnte eventuell Dennis' HTTP-Klasse helfen.

Starte doch einfach nochmal einen Versuch und poste hier die Probleme, die dabei auftauchen.

LG


----------



## nafets (18. Mai 2009)

Hallo

Schon mal Danke für eure Inputs. Habe was hinbekommen was meinen Bedürfnissen entspricht. Allerdings musste ich dazu das XML lokal auf meinem Webserver speichern, aber ich möchte diesen Schritt auch noch automatisieren indem er das File direkt von einem andere Server liest. Ähnlich RSS 

Hier mal mein Code für das auslesen der XML-Elemente die ich benötige und in der MySQL DB speichere.


```
<?php
include("../inc/conx.php");

// ################### //
// ## 				## //
// ##	KINO ELITE	## //
// ##				## //
// ################### //
// ################### //

$xml = simplexml_load_file("100008_shows.xml");

// Anzahl Shows bestimmen
$zahl = count($xml->Show);

// For Schleife anhand der gezählten Elemente und diese dann jeweils in die DB schreiben
// Alle Einträge auslesen, damit wir für die Darstellung alle Spieldaten haben, ebenfalls bei Spezialanlässen, 
// falls eine Vorstellung verschoben wird oder ausfällt.

	// Zuerst alle bestehenden Einträge löschen (jede Woche neu, so bestimmt keine alten Einträge vorhanden)
	mysql_query("TRUNCATE TABLE programm")
	or die(mysql_error());
	
for($i = 0; $i < $zahl; $i++)
    {
    // Die benötigten Elemente aus dem XML in Variablen speichern
    $myFilmtitel = $xml->Show[$i]->EventName;
    $myStartzeit = $xml->Show[$i]->ShowTime;
    $mySpieltag =  $xml->Show[$i]->ShowDate;
    $myKino = 	   $xml->Show[$i]->AuditoriumName;
    $mySprache =   "folgt"; //$xml->Show[$i]->Languageversion;
		
	// Neue Einträge in Datenbank schreiben
	mysql_query("INSERT INTO programm(filmtitel, startzeit, spieltag, kino, sprache) 
	VALUES('". $myFilmtitel ."', 
	'". $myStartzeit ."', 
	'". $mySpieltag ."', 
	'". $myKino ."', 
	'". $mySprache ."') ")
	or die(mysql_error());
		
    }
	echo "Einträge gespeichert";

?>
```

Versuche ich das File direkt via Link zu öffnen kommt folgende Fehlermedlung:
failed to open stream: no suitable wrapper could be found in /xml.php on line 11

Wenn mit jetzt noch jemand mit dem externen file helfen kann ... Juhuuuu 

Gruss


----------



## kuddeldaddeldu (18. Mai 2009)

Hi,

das wird an Deinen Servereinstellungen liegen (allow_url_fopen). Du könntest aber, wie bereits erwähnt, Dennis' HTTP-Klasse verwenden, um die Daten vom Server zu holen. Dazu lädst Du Dir die Klasse runter, nimmst die benötigte tcpconnection-Klasse auch gleich mit, bindest die ein und machst dann statt simplexml_load_file() ungefähr Folgendes:


```
$http=new httpconnection("ticketonline.sterk.ch");
$data=$http->get("seatplan/192.168.207.15_2603_100008_shows.xml");
$xml = simplexml_load_string($data['body']);
```

LG


----------



## nafets (19. Mai 2009)

Coole Sache

Danke vielmals. Habe es soeben ausprobiert und es funktioniert einwandfrei. Ich merke keinen Unterschied zu den lokal geladenen XML-Files. Nur dass ich jetzt nicht jede Woche zuerst die Files manuelle herunterkopieren muss. 

Jetzt noch vernünftig darstellen und den Cronjob machen - fertig ist das wöchentliche Kinoprogramm!!

Danke Danke.

Liebe Grüsse


----------



## nafets (19. Mai 2009)

Hallo nochmals

So weit so gut. Allerdings bin ich noch auf einen Stolperstein gestossen.
Ich habe noch ein weiteres XML File, dass ich einlesen und speichern muss. Das klappt mit dem oben erarbeiteten Code, allerdings kann ich ein Element nicht auslesen bzw. ich weiss nicht wie ich da drauf zugreifen soll.


```
<Event Name="Duplicity">
```

Normal greife ich ja auf die unterelemente wie z.B. 
	
	
	



```
<EventID>12345</EventID>
```
 zu. Aber wie kann ich das oben auslesen?

Die Unterobjekte spreche ich ja so an:

```
$myEvent =	   $xml->Event[$i]->EventID;
```

Habe schon diverse Möglichkeiten probiert, aber funktioniert nichts, leider.


----------



## kuddeldaddeldu (19. Mai 2009)

Hi,

da müsstest Du Dich mal etwas in XPath einarbeiten. 
Alle Event-Elemente mit dem Namen "Duplicity" im Dokument würdest Du z.B. so bekommen:


```
$events = $xml->xpath('//Event[@Name="Duplicity"]');
```

LG


----------



## nafets (19. Mai 2009)

Salut

Hmm, vielleicht habe ich mich falsch ausgedrückt. Ich meinte eigentlich wie komme ich an diesen Namen "Duplicity". Der ist ja von Event zu Event anderst. Und genau dieser fehlt mir ja, da dieser nicht als Element im Objekt vorhanden ist.


----------



## kuddeldaddeldu (19. Mai 2009)

Hi,

na, dafür bietet simplexml doch eine eigene Methode.

LG


----------



## nafets (19. Mai 2009)

kuddeldaddeldu du  bist echt in Ordnung 

Funktioniert und zwar so in meinem angewandten Code:

```
$myFilmname =  $xml->Event[$i]->attributes();
```

Danke viel viel mal. Hast mir echt geholfen.

Und wenn ich nochmals wo anstehe .. 
Aber sollte jetzt eigentlich gehen, nur noch etwas PHP.


----------

