SimpleXML - Wie ändere ich Dateien?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • SimpleXML - Wie ändere ich Dateien?

    Ich möchte eine XML-Datei anlegen und mit Inhalt füllen. Das habe ich jetzt so bewerkstelligt:
    PHP-Code:
      copy("users/tpl.tmu","users/$user_plain.tmu");
      
    $ufile simplexml_load_file("users/$user_plain.tmu");
      
    $ufile->addChild("userData");
      
    $ufile->userData->addChild("name");
      
    $ufile->userData->name $user;
      
    $ufile->userData->addChild("namePlain");
      
    $ufile->userData->namePlain $user_plain;
      
    $ufile->userData->addChild("pass");
      
    $ufile->userData->pass $phash;
      
    $ufile->userData->addChild("email");
      
    $ufile->userData->email $email;
      
    $ufile->addChild("userServers");

      
    $ufhandle fopen("$user_plain.tmu","w");
      
    fwrite($ufhandle,$ufile->asXML());
      
    fclose($ufhandle);
      
    header("Location: index.php?regDone=true"); 
    Da SimpleXML afaik keine Dateien anlegen kann, habe ich ein Template angelegt. Dieses sieht so aus:
    HTML-Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <user>
    </user>
    Nachdem sie mit SimpleXML bearbeitet wurde, soll sie in etwa so aussehen:
    HTML-Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <user>
      <userData>
        <name>Webmaster</name>
        <namePlain>webmaster</name>
        <pass>Mit md5() gewonner String</pass>
        <email>email.des@use.rs</email>
      </userData>
      <userServers>
        <!-- wird in einem anderen Script eingefügt -->
      </userServers>
    </user>
    copy() funktioniert, die neue Datei wird also angelegt. In SimpleXML muss ich aber einen Fehler gemacht haben, denn die neue Datei hat genau denselben Inhalt wie das Template.
    Woran liegt das?

  • #2
    Du musst die Datei auch speichern, die du veränderst. Momentan manipulierst du die Datei nur im internen Speicher, du gibst nie den tatsächlichen Wert zurück.

    Schau dir PHP: SimpleXMLElement::asXML - Manual das an.
    This is what happens when an unstoppable force meets an immovable object.

    Kommentar


    • #3
      Ich dachte, das macht fwrite()?
      Zuletzt geändert von Malachite; 28.08.2011, 20:36.

      Kommentar


      • #4
        Sorry, ich hatte übersehen, dass du asXML schon drin hast. Mein Fehler. Dann muss der Fehler wo anders liegen. Hast du mal versucht, den Rückgabewert von ->asXML auszugeben? Mit echo? Und dann mal geguckt, ob da alles richtig drinsteht?
        This is what happens when an unstoppable force meets an immovable object.

        Kommentar


        • #5
          Die Ausgabe ist syntaktisch korrekt, allerdings nicht verschachtelt. Aber das verhindert ja nicht die Speicherung.
          An fehlenden Dateirechten kann es eigentlich auch nicht liegen, die sind 755 mit www-data als Eigentümer. Außerdem gäbe PHP ja eine Notice aus, wenn es die Dateien nicht schreiben könnte.

          Kommentar


          • #6
            D'oh ... beim Einlesen der Datei gibst du ein Verzeichnis mit an - beim Schreiben dann aber nicht mehr

            Ausserdem kannst du asXML gleich als Parameter einen Dateinamen uebergeben, und dir somit das aufwendigere Oeffnen-Schreiben-Schliessen-Prozedere ersparen.
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              LOOL… Jetzt seh ichs auch. Und die ganzen XMLs wurden im Doc Root gespeichert…
              Ich und meine Zerstreutheit



              Noch eine Frage: Ist das normal, dass die XMLs nicht verschachtelt werden?

              Kommentar


              • #8
                Was meinst du mit verschachtelt? XML ist immer verschachtelt.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Ich nehme an du meinst eingerückt? Falls ja, dann ist das normal, für die Parser ist es ja irrelevant, da Leerzeichen/Tabs/Zeilenumbrüche sowieso ignoriert werden.

                  Wenn du das lesbar anzeigen lassen willst wirst du wohl oder übel einen Editor verwenden müssen, der dir das formatieren kann.
                  This is what happens when an unstoppable force meets an immovable object.

                  Kommentar


                  • #10
                    Oder du nimmst DOMDocument statt SimpleXML, da kannst du per
                    PHP-Code:
                    $doc->formatOutput true
                    angeben, dass es mit Einrückungen formatiert werden soll.
                    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                    Super, danke!
                    [/COLOR]

                    Kommentar


                    • #11
                      Ja aber SimpleXML quetscht alles in eine Zeile.
                      So sollte es aussehen:
                      HTML-Code:
                      <?xml version="1.0" encoding="UTF-8"?>
                      <user>
                              <userData>
                                    <name>bla</name>
                                        <namePlain>bla</namePlain>
                                        <pass>9cc9c27e4a7a69dc64001bf7cb67d89d</pass>
                                    <email>bla@blubb.blabla</email>
                              </userData>
                              <userServers>
                              </userServers>
                      </user>
                      Und so sieht es aus:
                      HTML-Code:
                      <?xml version="1.0" encoding="UTF-8"?>
                      <user>
                      <userData><name>bla</name><namePlain>bla</namePlain><pass>9cc9c27e4a7a69dc64001bf7cb67d89d</pass><email>bla@blubb.blabla</email></userData><userServers/></user>
                      EDIT: Nein, ich will es nicht lesbar anzeigen, aber es wäre doch schön, wenn SXML dass machen würde. Einfach aus ästhetischen Gründen.
                      Zuletzt geändert von Malachite; 29.08.2011, 16:01.

                      Kommentar


                      • #12
                        Wenn du die Dateien nur programmtechnisch bearbeitest, ist es sogar besser, wenn alles in einer Zeile steht. Kleinere Dateigröße, weniger Arbeit für den Parser.

                        Ästhetik ist hier fehl am Platz. Wenn du es eingerückt haben willst, höre auf Amica oder leb damit, was SimpleXML dir liefert.
                        This is what happens when an unstoppable force meets an immovable object.

                        Kommentar


                        • #13
                          Jaja, ich weiß, dass Ästhetik hier nicht reingehört, aber so bin ich halt…
                          Zumal der Parser eh viel zu tun hat (Smarty, UDP etc.), da machen die paar Zeilenumbrüche nicht viel aus, denk ich mal.

                          Aber gut, Problem gelöst, dafür
                          Zuletzt geändert von Malachite; 29.08.2011, 18:18.

                          Kommentar

                          Lädt...
                          X