2010-12-12 155 views
1

我試圖使用simpleXML更改XML文件中節點的內容。我知道新節點內容的變量包含正確的內容,但由於某些原因,文件在保存時不會更改。我可能錯過了一些基本的東西,因爲我是simpleXML的新手。這裏是整個PHP腳本:php和simpleXml - 如何更改節點內容

<?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

這是一個巨大的代碼塊,包含大量與您的問題無關的代碼。將其修剪至最低限度,這將使人們更容易閱讀並回答。沒有人想要破譯30行代碼,可以用一句話來概括這個問題。 – 2010-12-12 07:59:18

回答

1

我敢說,這個代碼肯定不會你想讓它是什麼做的:

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

更改PHP變量的值沒有任何副作用。換句話說,除了在某些特定情況下,除$a = $b;之外沒有任何反應,它不是其中之一。

我不知道你真的想用這段代碼實現什麼。如果要替換特定<div/>中的(X)HTML,您將需要使用DOM並創建一個DOMDocumentFragment,使用appendXML()填充它,然後將其替換爲舊的<div/>。要麼或者創建一個new DOMDocumentloadXML()然後importNode()到您的舊文檔和replaceChild()您的舊div。

+0

謝謝。我很困惑。這聽起來像我需要使用DOM來實際更改XML節點的內容。回到繪圖板。 – monotasker 2010-12-13 16:21:57

+0

您可以使用SimpleXML或DOM來更改節點的內容,但是如果要注入XML和其他DOM操作,肯定需要DOM。 – 2010-12-13 16:49:46

-1

SimpleXMLElement::xpath返回的SimpleXMLElement對象的數組。副本,而不是引用。因此$oldVerse = $newVerse;不會以任何方式更改$xmlDoc。 SimpleXML足以讀取XML,對於您可能想要從http://www.php.net/manual/de/refs.xml.php(例如, DOM

+1

這個答案在許多方面都是錯誤的。 xpath()返回一個對象數組,每個對象「引用」原始文檔中的節點。它不是節點的「複製」(或克隆)。 SimpleXML擅長閱讀和編寫通用XML,DOM處理與DOM相關的操作。這不是「更強大」,它只是一個不同的目標。使用SimpleXML生成XML更容易,更簡潔。 DOM操作DOM文檔更容易。 – 2010-12-12 08:04:49

+0

@Josh Davis:返回值的行爲與引用類似,但實際上它們並不引用實際對象,而是引用系統資源。因此,除了更改屬性外,您不能操作'$ xmlDoc',這是暴露的數組接口的副作用。 – rik 2010-12-13 09:41:00