2010-12-12 5 views
1

Ich versuche, den Inhalt eines Knotens in einer XML-Datei mit SimpleXML zu ändern. Ich weiß, dass die Variable für den neuen Node-Inhalt das richtige Zeug enthält, aber aus irgendeinem Grund wird die Datei nicht geändert, wenn sie gespeichert wird. Ich verpasse wahrscheinlich etwas Grundlegendes, weil ich neu bei simpleXML bin. Hier ist der gesamte PHP-Skript:php und simpleXml - wie Knoten Inhalt ändern

<?php 
    $doc=$_REQUEST["book"]; 
    $div1=$_REQUEST["div1"]; 
    $div2=$_REQUEST["div2"]; 
    if ($div1=="") $div1=$_REQUEST["chapter"]; 
    if ($div2=="") $div2=$_REQUEST["verse"]; 
    $div3=$_REQUEST["div3"]; 
    $textresponse=$_REQUEST["xmltext"]; 
    $strippedresponse = "<?xml version='1.0'?>" . stripslashes($textresponse); 
    echo("Saved changes to " . $doc . " " . $div1 . "." . $div2 ."<br />");  
    $fileName="/home/ocp/public_html/sites/default/docs/drafts/".$doc.".xml"; 
    $xmlDoc = simplexml_load_file($fileName); 
    $backupFileName="/home/ocp/public_html/sites/default/docs/backups/".$doc." ".date("Y-m-d H.i.s").".xml"; 
    file_put_contents($backupFileName, $xmlDoc->asXML()); 
    $backupSize = filesize($backupFileName); 
    echo("Backup {$backupFileName} created:".$backupSize." bytes<br />"); 
    if ($doc) { 
     if ($div1) { 
      if ($div2) { 
       $newVerse = simplexml_load_string($strippedresponse); 
     $oldVerse = $xmlDoc->xpath("//div[@number='".$div1."']/div[@number='".$div2."']"); 
     $oldVerse = $newVerse; 

       $newDoc = $xmlDoc->asXml(); 
      file_put_contents($fileName, $newDoc); 
      $newSize = filesize($fileName); 
       echo("New file is ".$newSize." bytes <br />"); 
      } 
     } 
    } 
?> 
+0

Das ist ein riesiger Code, der viel Code enthält, der nichts mit Ihrem Problem zu tun hat. Schneiden Sie es auf das Nötigste herunter, es wird es den Leuten leichter machen, es zu lesen und zu beantworten. Niemand möchte 30 Zeilen Code für eine Frage entschlüsseln, die in einem Satz zusammengefasst werden kann. –

Antwort

1

Ich werde wagen zu sagen, dass dieser Code sicherlich nicht tut, was Sie wollen es:

$newVerse = simplexml_load_string($strippedresponse); 
$oldVerse = $xmlDoc->xpath("//div[@number='".$div1."']/div[@number='".$div2."']"); 
$oldVerse = $newVerse; 

Ändern des Wertes einer PHP-Variablen hat keine Nebenwirkungen. Mit anderen Worten passiert nichts, wenn Sie $a = $b; tun, außer in einigen spezifischen Fällen, und es ist keiner von ihnen.

Ich weiß nicht, was Sie wirklich mit diesem Code erreichen möchten. Wenn Sie das (X) HTML in einem spezifischen <div/> ersetzen möchten, müssen Sie DOM verwenden und ein DOMDocumentFragment erstellen, verwenden Sie appendXML(), um es zu bevölkern, dann ersetzen Sie es zu Ihrem alten <div/>. Entweder das oder erstellen Sie eine new DOMDocument, loadXML() dann importNode() zu Ihrem alten Dokument und replaceChild() Ihre alte Div.

+0

Danke. Ich war eindeutig verwirrt. Es klingt wie ich DOM verwenden muss, um den Inhalt eines XML-Knotens tatsächlich zu ändern. Zurück zum Zeichenbrett. – monotasker

+0

Sie können entweder SimpleXML oder DOM verwenden, um den Inhalt eines Knotens zu ändern, aber Sie werden definitiv DOM benötigen, wenn Sie XML- und andere DOM-Operationen injizieren wollen, ja. –

-1

SimpleXMLElement::xpath gibt einen Array von SimpleXMLElement Objekten. Kopien, keine Referenzen. So ändert sich $oldVerse = $newVerse; in keiner Weise $xmlDoc. SimpleXML reicht aus, um XML zu lesen, für die Manipulation möchten Sie möglicherweise eine leistungsfähigere Alternative aus http://www.php.net/manual/de/refs.xml.php, z. DOM.

+1

Diese Antwort ist in vieler Hinsicht falsch. xpath() gibt ein Array von Objekten zurück, wobei jedes Objekt auf den Knoten im Originaldokument "verweist". Es ist keine "Kopie" (oder Klon) des Knotens. SimpleXML eignet sich hervorragend zum Lesen und Schreiben von generischem XML, DOM behandelt DOM-bezogene Operationen. Es ist nicht "mächtiger", es ist nur ein anderes Ziel. Das Generieren von XML ist mit SimpleXML viel einfacher und weniger ausführlich. Das Bearbeiten von DOM-Dokumenten ist mit DOM einfacher. –

+0

@Josh Davis: Die zurückgegebenen Werte verhalten sich wie Referenzen, aber sie verweisen nicht auf reale Objekte, sondern auf Systemressourcen. Daher können Sie '$ xmlDoc' nicht manipulieren, außer dass Sie Attribute ändern, und dies ist eher ein Nebeneffekt der exponierten Array-Schnittstelle. – rik