PHP - Text aus datei loeschen

Eine andere Frage zu XML habe ich eigentlich auch noch.
Mit $dom->saveXML(); wird ja der ueberarbeitete Text ausgegeben, aber kann ich den die xml Datei auch direkt damit aktualisieren oder muss ich den Text speichern und dann mit normalen PHP die xml datei aendern.

Also so mache ich das im Moment:
PHP:
$strxml = $dom->saveXML();
$handle = fopen("yourxmlfile.xml", "w");
fwrite($handle, $strxml);
fclose($handle);

aber vielleicht ist es auch direkt mit anderen PHP XML Funktionen noch einfacher moeglich oder?
 
Zu den Wörtern:

Musst du die Daten über ein Netzwerk übertragen?
Die Datenmengen sind echt so klein für die Computer heutzutage, das macht nichts mehr aus.

Zu XML: du suchst [phpf]file_put_contents[/phpf] (ruft intern übrigens auch fopen, fwrite und fclose auf) ;)
 
Ich muss die Daten die meiste Zeit vom Webserver zu einem lokalen Programm welches auf meinem PC laeuft, uebertragen.
Das lokale Programm ruft die Dateien ueber HTTP Get vom Webserver auf und speichert den Inhalt als string.
Den string lese ich dann mit dem Programm aus und bekomme so meine Daten.
Und ich schicke dann auch manchmal Daten vom lokalen Programm aus mit HTTP Get zum Webserver wo es dann mit PHP Dateien abgespeichert wird.
So findet die ganze zeit der datenaustausch statt. Ist bestimmt nicht so proffesionell im Moment, aber ich will es erst mal soweit gut zum laufen bringen und kann spaeter noch optimieren.

Wenn ich nur einzelne Tags in der XML Dateie aktualisieren will gibts da keine Loesung fuer? Mit file_put_contents() oder fwrite muss ich ja immer die ganze Datei neu ueberschreiben?
 
Wenn ich nur einzelne Tags in der XML Dateie aktualisieren will gibts da keine Loesung fuer?

Nicht das ich wüsste. Also natürlich kannst du wieder Stringmanipulationen versuchen, aber wo ist das Problem bei deinen kleinen Dateien?

Du könntest ja ein Skript konzipieren, das alle Dateien zusammenlädt und an dein Clienten (Programm) schickt, sodass das Programm nur einen Request abfeuern muss.
 
ja wenn es keine andere Loesung gibt benutze ich auch wieder Stringmanpulation.

Und wenn das soweit alles laeuft kann ich ja nochmal nach optimierungen suchen, auch sowas wie zusammen packen von allen Daten fuer ein Request.
 
Wenn du in einer Textdatei nachschauen will ob ein Tag mit folgenden Namen schon drine steht "<Auftrag 123>" mit welcher PHP Funktion wuerdest du das machen?

Ich mache das im Moment so:

PHP:
if(strpos($content, "<Auftrag 123>")===false)

Wenn die Rueckgabe false ist schreibe ich den Datensatz in die Datei, weil ich davon ausgehe das er noch nicht drine steht wenn strpos() false zurueck gibt.
 
Ja, das wäre wohl die schnellste Möglichkeit in Bezug auf Performance.

(Das nimmt natürlich keine Rücksicht, wenn dieser Tag in einem Kommentar steht, aber das solltest du ausschließen können.)
 
Wenn du willst schau dir mal mein komplettes Aktualisierungs Beispiel an und beurteile ob das gut ist oder ob man das besser machen kann, das folgende Beispiel soll neue Daten in eine Datei schreiben und vorher erst immer kucken ob die daten schon drine sind.

Wenn die Daten schon drine sind soll es sie mit neuen aktualisieren/ersetzen:

PHP:
        $file = "test.txt";
        $content = file_get_contents($file);
         if(strpos($content, "<Auftrag 123>")===false)
         {
           $ourFileHandle = fopen($file, 'a') or die("can't open file");
           if($ourFileHandle!=false)
           {
             fwrite($ourFileHandle, "<Auftrag 123>10</Auftrag 123>");
           }
           fclose($ourFileHandle);
         }
        if(strpos($content, "<Auftrag 123>")>=0 && strlen($content)>2)
            {
              // updaten 
              if($ourFileHandle!=false)
              {
               $search = '#(<Auftrag 123.*?>).*?(</Auftrag 123>)#';
               $replace = "<Auftrag 123>20</Auftrag 123>";
               $newcontent = preg_replace($search,$replace,$content);  
               $ourFileHandle = fopen($file, 'w') or die("can't open file");
               fwrite($ourFileHandle, $newcontent);
              }
              fclose($ourFileHandle);
            }
 
1. Du kannst nicht einfach ein <Auftrag>-Tag hinzufügen, das resultierende Dokument würde nicht XML-konform sein! (Du brichst damit aus dem Root-Element sozusagen aus.)

2. strpos() >= 0? Wieso nicht einfach strpos() !== false?

3. $newContent kannst du auch mit file_put_contents() schreiben, dazu brauchst du nicht wieder fopen(), fwrite() und fclose().

4. Du hast zweimal fclose(), redundant.

5. Normalerweise Single Quotes benutzen, wenn keine Variablen eingebettet wurden (eher pers. Präferenz).

6. Variablennamen-Groß/Kleinschreibung konsistent halten. Z.B. hast du einmal "ourFileHandle" und ein anderes Mal "newcontent", wobei das 'C' großgeschrieben werden müsste.

7. Fehlerbehandlung sauberer abwickeln als mit die(). Evtl. mit Exceptions.

8. Am Besten solltest du den Auftrag-String, den du suchst, nicht im Code hardkodieren.
 
Zurück