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?

    Edited once, last by Turael ().

  • 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 !

    Edited once, last by Tell ().

  • 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


    time.xml


    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]

    Edited once, last by BlueDogi ().

  • 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