2010-12-12 41 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