xml-feed auslesen

Netagent

Grünschnabel
Hallo zusammen,
ich habe ein kleines Problem mit dem auslesen von einem xml-Feed. Folgende xml Datei wird benutzt (Beispiel):

PHP:
<?xml version='1.0' standalone='yes'?>
<movies>
 <movie>
  <title>Movie 1</title>
  <characters>
   <character>
   <name>Ms. Coder</name>
   <actor>Onlivia Actora</actor>
   </character>
   <character>
   <name>Mr. Coder</name>
   <actor>El ActÓr</actor>
   </character>
  </characters>
 </movie>
</movies>

Jetzt habe ich das Problem das ich die "<character>" Tags nicht vernünftig ausgelesen und geordnet bekomme. Entweder bekomme ich gar keine ausgelesen oder alle komplett - also alle "<character>" von allen "<movie>" in einem Datensatz. Ich möchte aber natürlich nur die "<character>" die auch zum dem dazugehörigen "<movie>" gehören. Das können aber einmal 2 und das andere mal 10 "<character>" Tags sein.
Wie kann ich das in dem folgenden xml-Reader hin bekommen?

PHP:
// RSS Fedd
$stream = "deineXMLdatei";

// Feed laden
if (!$xml = simplexml_load_file ($stream)) {
    die("Fehler beim Einlesen der XML Datei");
}

// Ausgabe Array
$out = array();
// auszulesende Datensaetze
$i = 5;

// Items vorhanden?
if (!isset($xml->movies->movie)) {
    die("Keine Items vorhanden");
}

// fetchen der Items
foreach($xml->movies->movie as $item) { 
    $data = array();
    $data['title'] = $item->title;
    //$data['date'] = date("d.m.Y", strtotime($item->pubDate));
    
    // Pushen des Ausgabe Array´s
    array_push($out, $data);
    
    // wenn auszulesende Datensaetze erreicht -> Abbruch
    if ($i == 1) {
        break;
    }
    $i--;
}

// in $out stecken nun die Datensaetze

Ich habe leider über die Forensuche noch in phpnet nichts geeignetes gefunden was ich auch kapiere ;) Da ich mich normal mit xml nicht so beschäftige, hab ich leider auch nicht DIE Ahnung davon. Für eine Hilfe von Euch wäre ich sehr dankbar.

Viele Grüße
Dierk
 
Hmm, hat keiner eine Ahnung? So schwer kann das für die "Spezies" doch nicht sein hier ;)
Falls ich mich unklar ausgedrückt habe oder das Problem nicht verstanden wird - bitte Bescheid sagen...
Danke für Eure Hilfe
Dierk
 
PHP:
<?php
// RSS Fedd
$stream = "./test.xml";

// Feed laden
if (!$xml = simplexml_load_file ($stream)) {
    die("Fehler beim Einlesen der XML Datei");
}
// Ausgabe Array
$out = array();
// ermittelt anzahl der datensätze
$i = 5;

// Items vorhanden?
if (!isset($xml->movie)) {
   echo "Keine Items vorhanden";
}

// fetchen der Items
foreach($xml->movie as $item) {
    $data = array();
    $data['title'] = $item->title;
    //$data['date'] = date("d.m.Y", strtotime($item->pubDate));
    
    // Pushen des Ausgabe Array´s
    array_push($out, $data);
    
    // wenn auszulesende Datensaetze erreicht -> Abbruch 
    if ($i == 1) {
        break;
    }
    $i--;     
}

// in $out stecken nun die Datensaetze
?>
So funktioniert es bei mir.
 
@Flex,

zunächst mal dankeschön für Deine Mühe. Aber das ist nicht das Problem...
Funktionieren tut es bei mir auch so - aber ich möchte ja die beschriebenen "<character>" Tags auslesen. Die sind dem "<movie>" Tag untergeordnet und können in der Anzahl verschieden sein. Verstehst Du mein Problem?

Viele GRüße
Dierk
 
Ups... Allerdings hat dein oben gepostetes Script bei mir nicht funktioniert... ;)

PHP:
<?php
// RSS Fedd
$stream = "./test.xml";

// Feed laden
if (!$xml = simplexml_load_file ($stream)) {
    die("Fehler beim Einlesen der XML Datei");
}
// Ausgabe Array
$out = array();
// ermittelt anzahl der datensätze
$i = 5;

// Items vorhanden?
if (!isset($xml->movie)) {
   echo "Keine Items vorhanden";
}

// fetchen der Items
foreach($xml->movie as $item) {
    $data = array();
    $data['title'] = $item->title;
    $n = count($item->characters->character);
    for($j = 0; $j < $n; $j++) {
    $data['character'][$j]['name'] = $item->characters->character->name;
    $data['character'][$j]['actor'] = $item->characters->character->actor;
    }
    //$data['date'] = date("d.m.Y", strtotime($item->pubDate));
    
    // Pushen des Ausgabe Array´s
    array_push($out, $data);
    
    // wenn auszulesende Datensaetze erreicht -> Abbruch 
    if ($i == 1) {
        break;
    }
    $i--;     
}

// in $out stecken nun die Datensaetze
?>
Funktioniert so bei mir.
 
So in etwa hauts hin. Ich musste für die Ausgebe lediglich noch eine "}" versetzen ;)
Flex, ich danke Dir - bin ich doch wieder um einen Trick schlauer :-)

Viele Grüße
Dierk
 
Zurück