XML - Eintrag ganz oben

Hallo Leute,

ich möchte eine Tracklist für einen Flashplayer erstellen,
jeder neue Eintrag soll an den Anfang der Tracklist geschrieben werden.

Leider schreibt SimpleXML die Eintrage immer an den Schluss.
Gibt es da eine Möglichkeit, dem Skript zu sagen, dass das an den Anfang gehört ?


Code:
$xml = simplexml_load_file("playlist.xml");

$bericht = $xml->trackList[0]->addChild('track');
$bericht->addChild("location", "26.mp3");
$bericht->addChild("title", "Testi-Testi");
$handle = fopen("playlist.xml", "wb"); 
fwrite($handle, $xml->asXML());
fclose($handle);

Danke im Vorraus.

Liebe Grüße
Mike
 
Code:
<?xml version="1.0" encoding="UTF-8"?>
<playlist xmlns="http://xspf.org/ns/0/" version="1">
    <title>Ounage Playlist</title>
    <creator>Dew</creator>
    <link>http://www.blup.fr/</link>
    <info>The Best Playlist</info>
    

    <trackList>

	<track>
          <location>readings/10.mp3</location>
	  <title>Der See - Artkor</title>
	 </track>
     </tracklist>
</playlist>

Die Einträge werden nun mit meinem bisherigem Script als weiterer Track unter den bestehenden geschrieben. Ich möchte aber, dass der neue Eintrag immer als erster Track eingeschrieben wird.

Danke für die Antwort.

LG Michael
 
Die Playlist wird nicht von einem anderen Programm erstellt.
Die Playlist erweitere ich per PHP wenn meine User die Tracks hochladen.
Die Playlist wird von einem anderen Programm (Dewplayer - Flash) abgespielt.
An der Art und Weise, wie Dewplayer die Playlist liest, kann ich nichts verändern.
Deshalb muss ich die neuen Tracks so einschreiben, dass es gleich richtige gelesen wird.

Das Script

$xml = simplexml_load_file("playlist.xml");

$bericht = $xml->trackList[0]->addChild('track');
$bericht->addChild("location", "26.mp3");
$bericht->addChild("title", "Testi-Testi");
$handle = fopen("playlist.xml", "wb");
fwrite($handle, $xml->asXML());
fclose($handle);

das funktioniert super. Nur ist der Eintrag immer unten und wird vom Player auch ans Ende der Playlist gelesen. Ich möchte aber, dass die neuen Einträge oben stehen. Sonst sehen die User immer den ältesten Eintrag :) was ja nicht gerade sinnvoll ist :D .

LG Mike
 
Ich habe nun verstanden. Ich weiß nicht, obs dich weiter bringt, aber ich hab das Codesnippet hier gefunden:

PHP:
class SimpleXMLElementEx extends SimpleXMLElement
{
    public function insertChildFirst($name, $value, $namespace)
    {
        // Convert ourselves to DOM.
        $targetDom = dom_import_simplexml($this);
        // Check for children
        $hasChildren = $targetDom->hasChildNodes();

        // Create the new childnode.
        $newNode = $this->addChild($name, $value, $namespace);

        // Put in the first position.
        if ($hasChildren)
        {
            $newNodeDom = $targetDom->ownerDocument->importNode(dom_import_simplexml($newNode), true);
            $targetDom->insertBefore($newNodeDom, $targetDom->firstChild);
        }

        // Return the new node.
        return $newNode;
    }
}
 
geht sicher auch eleganter
PHP:
$xml = simplexml_load_string($string);
//Tracks extrahieren
$tracks = array();
foreach($xml->trackList->children() as $track){
    //Tracks in ein Array wandeln
    $tracks[] = (array) $track;
} 
//Tracks im XML löschen
unset($xml->trackList->track);
//Neuer Track an den Anfang setzen
array_unshift($tracks, array('location' => '26.mp3', 'title' => 'Testi-Testi'));
//Alle Tracks des Arrays dem XML wieder anfügen
foreach($tracks as $tag => $track){
    $chield = $xml->trackList->addChild('track');
    $chield->addChild('location', $track['location']);
    $chield->addChild('title', $track['title']);
}

var_dump($xml);

Nachtrag: Das von saftmeister ist eleganter....
 
Hallo,

ich würde es gleich alles im DOM bearbeiten, da gibt es die insertBefore-Methode in der DOMNode-Klasse. Der Codesnippet in Saftmeisters Beitrag verwendet sie auch:
PHP:
$xml = new DOMDocument();
$xml->load('playlist.xml');

$trackList = $xml->getElementsByTagName('trackList')->item(0);
$newTrack = $xml->createElement('track');

// Gibt es Kindknoten in der Trackliste?
if($trackList->hasChildNodes())
{
	$firstTrack = $trackList->firstChild;
	$trackList->insertBefore($newTrack,$firstTrack);
} else {
	$trackList->appendChild($newTrack);
}

$firstTrack = $trackList->firstChild;

$bericht = $xml->createElement('location','26.mp3');
$firstTrack->appendChild($bericht);

$bericht = $xml->createElement('title','Testi-Testi');
$firstTrack->appendChild($bericht);

header("Content-Type: text/xml");
echo $xml->saveXML();
 
Zurück