XML Datei öffnen

  • Hallo zusammen,

    ich habe ein kleines Problem mit PHP. Ich würde gerne Werte in einer XML-Datei ändern. Als Bsp habe ich mir diese Das hier ausgesucht.

    Mein Code sieht wie volgt aus:
    [code=php] <?php

    # Datei öffnen
    function openXMLfile($xmlfile){
    if(!isset($GLOBALS['xmlObjects'][$xmlfile])){
    $xmlobj = simplexml_load_file($xmlfile);
    $GLOBALS['xmlObjects'][$xmlfile] = $xmlobj;

    }
    }
    # Wert ändern
    function changeXMLvalue($xmlfile, $xmlpath, $xmlnode, $xmlvalue=''){
    $xmlobj = $GLOBALS['xmlObjects'][$xmlfile]->xpath($xmlpath);
    $xmlobj[0]->{$xmlnode} = htmlspecialchars($xmlvalue);
    }
    # XML-Datei speichern
    function saveXMLfile($xmlfile){
    if(!isset($GLOBALS['xmlObjects'][$xmlfile])){
    trigger_error('Die Datei "'.$xmlfile.'" wurde nie geöffnet.');
    return false;
    }
    $xmlFileValue = $GLOBALS['xmlObjects'][$xmlfile]->asXML();
    file_put_contents($xmlfile, $xmlFileValue);
    }

    openXMLfile('datei.xml');
    changeXMLvalue('datei.xml', '/liste/dino[@nummer="3"]', 'ort', 'Mongolei');
    saveXMLfile('datei.xml');
    ?>[/php]

    Die XML-Datei ist die aus dem Beispiel. Das Funktioniert aber nicht...
    Was habe ich falsch gemacht?

    Einmal editiert, zuletzt von Turael (20. April 2015 um 07:26)

  • Radikal vereinfacht, aber funktioniert:

    PHP
    <?php
      $xml              = simplexml_load_file( "file.xml" ) ;
      $elements         = $xml->xpath( '/liste/dino[@nummer="3"]' ) ;
      $elements[0]->ort = "Mongolei" ;
      file_put_contents( "file.xml", $xml->asXML() ) ;
    ?>

    Das File muss fuer den User des Webservers schreibbar sein !

    Einmal editiert, zuletzt von Tell (20. April 2015 um 00:29)

  • Danke für deine Antwort.

    Leider funktioniert es immer noch nicht.

    Die Schreibrechte habe ich mit

    Code
    sudo usermod -a -G www-data pi
    sudo chown -R pi /var/www


    vergeben.

    Mein Code sieht aktuell wie folgt aus:

    Ich weis das die Funktion $_GET['box'] funktioniert. Aber die XML-Datei wird nicht geändert.
    Hat jemand noch eine Idee?

  • Hallo!

    Ich stand irgendwann auch mal vor dem Problem :)
    Hab dann folgendes erfolgreich geschrieben bekommen, bei mir läuft es heute noch so in etwa...

    bearbeiten.php

    Spoiler anzeigen

    [code=php]$CONFIG_FILENAME = 'time.xml';
    //config.xml dateisystem rechte überprüfen
    if(!file_exists($CONFIG_FILENAME)) {
    echo "Kann die Konfiguration (".$CONFIG_FILENAME.") nicht finden!\n";
    exit(1);
    }
    if(!is_readable($CONFIG_FILENAME)) {
    echo "Kann die Konfiguration (".$CONFIG_FILENAME.") nicht lesen!\n";
    exit(2);
    }
    if(!is_writable($CONFIG_FILENAME)) {
    echo "Kann die Konfiguration (".$CONFIG_FILENAME.") nicht schreiben!\n";
    exit(3);
    }

    //config.xml einlesen
    libxml_use_internal_errors(true);
    $xml = simplexml_load_file($CONFIG_FILENAME);
    if (!$xml) {
    echo "Kann die Konfiguration (".$CONFIG_FILENAME.") nicht laden!\n";
    foreach(libxml_get_errors() as $error) {
    echo "\t", $error->message;
    }
    exit(4);
    }

    $heute = date("Y-m-d H:i", strtotime("0 week 0 days 0 hours 1 minutes"));

    $xpath='//timer/id[.="'.$_GET['id'].'"]/parent::*';
    $res = $xml->xpath($xpath);
    $parent = $res[0];

    //Hier alles ändern nach dem Schema:
    // $parent[0]->knotenname = neuer Wert;
    $parent[0]->time= $heute;


    $dom = new DOMDocument('1.0');
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = true;
    $dom->loadXML($xml->asXML());
    $dom->save($CONFIG_FILENAME);
    echo "ok";[/php]


    time.xml

    Spoiler anzeigen

    [code=php]<?xml version="1.0"?>
    <config>
    <timer>
    <id>1</id>
    <time>2015-04-20 17:35</time>
    </timer>
    </config>
    [/php]

    Beim Aufruf der bearbeiten.php?id=1 wird in der time.xml der Tag <time> von dem <timer> mit der ID 1 aktualisiert.

    Ich hoffe es ist verständlich ;)

  • Danke für deine Antwort es geht zwar immer noch nicht aber jetzt habe ich sowas wie eine Spur... Ich habe meinen Programanfang durch deinen ersetzt und angepasst, also diesen Teil:

    Mein PHP Code sieht inzwichen so aus:
    [code=php]<?php

    $CONFIG_FILENAME = 'Dim.xml';
    //config.xml dateisystem rechte überprüfen
    if(!file_exists($CONFIG_FILENAME)) {
    echo "Kann die Konfiguration (".$CONFIG_FILENAME.") nicht finden!\n";
    exit(1);
    }
    if(!is_readable($CONFIG_FILENAME)) {
    echo "Kann die Konfiguration (".$CONFIG_FILENAME.") nicht lesen!\n";
    exit(2);
    }
    if(!is_writable($CONFIG_FILENAME)) {
    echo "Kann die Konfiguration (".$CONFIG_FILENAME.") nicht schreiben!\n";
    exit(3);
    }

    libxml_use_internal_errors(true);
    $xml = simplexml_load_file($CONFIG_FILENAME);
    if (!$xml) {
    echo "Kann die Konfiguration (".$CONFIG_FILENAME.") nicht laden!\n";
    foreach(libxml_get_errors() as $error) {
    echo "\t", $error->message;
    }
    exit(4);
    }

    switch($_GET['box']){
    case ("Green1"):
    $Green_value = 100;
    $do_nothing_Green = 0;
    break;

    case ("Green2"):
    $Green_value = 90;
    $do_nothing_Green = 0;
    break;

    case ("Green3"):
    $Green_value = 70;
    break;

    case ("Green4"):
    $Green_value = 60;
    $do_nothing_Green = 0;
    break;

    case ("Green5"):
    $Green_value = 50;
    $do_nothing_Green = 0;
    break;

    case ("Green6"):
    $Green_value = 40;
    $do_nothing_Green = 0;
    break;

    case ("Green7"):
    $Green_value = 30;
    $do_nothing_Green = 0;
    break;

    case ("Green8"):
    $Green_value = 20;
    $do_nothing_Green = 0;
    break;

    case ("Green9"):
    $Green_value = 0;
    $do_nothing_Green = 0;
    break;

    default:
    $do_nothing_Green = 1;
    break;
    }

    switch($_GET['box']){
    case ("Red1"):
    $Red_value = 100;
    $do_nothing_Red = 0;
    break;

    case ("Red2"):
    $Red_value = 90;
    $do_nothing_Red = 0;
    break;

    case ("Red3"):
    $Red_value = 70;
    $do_nothing_Red = 0;
    break;

    case ("Red4"):
    $Red_value = 60;
    $do_nothing_Red = 0;
    break;

    case ("Red5"):
    $Red_value = 50;
    $do_nothing_Red = 0;
    break;

    case ("Red6"):
    $Red_value = 40;
    $do_nothing_Red = 0;
    break;

    case ("Red7"):
    $Red_value = 30;
    $do_nothing_Red = 0;
    break;

    case ("Red8"):
    $Red_value = 20;
    $do_nothing_Red = 0;
    break;

    case ("Red9"):
    $Red_value = 0;
    $do_nothing_Red = 0;
    break;

    default:
    $do_nothing_Red = 1;
    break;
    }

    switch($_GET['box']){
    case ("Blue1"):
    $Blue_value = 100;
    $do_nothing_Blue= 0;
    break;

    case ("Blue2"):
    $Blue_value = 90;
    $do_nothing_Blue= 0;
    break;

    case ("Blue3"):
    $Blue_value = 70;
    $do_nothing_Blue= 0;
    break;

    case ("Blue4"):
    $Blue_value = 60;
    $do_nothing_Blue= 0;
    break;

    case ("Blue5"):
    $Blue_value = 50;
    $do_nothing_Blue= 0;
    break;

    case ("Blue6"):
    $Blue_value = 40;
    $do_nothing_Blue= 0;
    break;

    case ("Blue7"):
    $Blue_value = 30;
    $do_nothing_Blue= 0;
    break;

    case ("Blue8"):
    $Blue_value = 20;
    $do_nothing_Blue= 0;
    break;

    case ("Blue9"):
    $Blue_value = 0;
    $do_nothing_Blue= 0;
    break;

    default:
    $do_nothing_Blue = 1;
    break;
    }

    if($do_nothing_Green == 0 ) {$xml->Green_value = $Green_value ;}
    if($do_nothing_Red == 0 ) {$xml->Red_value = $Red_value ;}
    if($do_nothing_Blue == 0 ) {$xml->Blue_value = $Blue_value ;}

    $xml->Green_value = $Green_value ;
    $xml->Red_value = $Red_value ;
    $xml->Blue_value = $Blue_value ;

    $dom = new DOMDocument('1.0');
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = true;
    $dom->loadXML($xml->asXML());
    $dom->save($CONFIG_FILENAME);
    echo "ok";

    ?>[/php]

    Einmal editiert, zuletzt von BlueDogi (20. April 2015 um 21:12)

  • Hey!

    Das klingt doch gut!

    Das ist kein Fehler sondern zeichensparendes XML. PHP macht das so und ändert das auch wieder von alleine in das dir bekannte Muster. Aber erst wenn da Daten gespeichert werden ;)

    LG Kleiner Mann

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!