2010-12-12 35 views
1

J'essaie de changer le contenu d'un noeud dans un fichier XML en utilisant simpleXML. Je sais que la variable pour le nouveau contenu de noeud contient les bonnes choses, mais pour une raison quelconque le fichier n'est pas changé quand il est sauvegardé. Je manque probablement quelque chose de basique, parce que je suis nouveau à simpleXML. Voici le tout script php:php et simpleXml - comment changer le contenu des noeuds

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

C'est un énorme morceau de code, contenant beaucoup de code sans rapport avec votre problème. Coupez-le au strict minimum, il sera plus facile pour les gens de le lire et de répondre. Personne ne veut déchiffrer 30 lignes de code pour une question qui peut être résumée en une phrase. –

Répondre

1

Je risquerais à dire que ce code ne certainement pas ce que vous voulez qu'il:

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

Modification de la valeur d'une variable PHP n'a pas d'effets secondaires. En d'autres termes, rien ne se passe lorsque vous faites $a = $b; sauf dans certains cas spécifiques, et ce n'est pas l'un d'entre eux.

Je ne sais pas ce que vous voulez vraiment réaliser avec ce code. Si vous voulez remplacer le (X) HTML à l'intérieur d'un <div/> spécifique, vous devrez utiliser DOM et créer un DOMDocumentFragment, utilisez appendXML() pour le remplir puis le remplacer par votre ancien <div/>. Soit cela ou créer un new DOMDocument, loadXML() puis importNode() à votre ancien document et replaceChild() votre ancien div.

+0

Merci. J'étais clairement confus. Il semble que j'ai besoin d'utiliser DOM pour modifier le contenu d'un nœud XML. Retour à la planche à dessin. – monotasker

+0

Vous pouvez utiliser SimpleXML ou DOM pour modifier le contenu d'un nœud, mais vous aurez certainement besoin de DOM si vous voulez injecter XML et d'autres opérations DOM, oui. –

-1

SimpleXMLElement::xpath retourne un tableau d'objets SimpleXMLElement. Des copies, pas des références. Donc $oldVerse = $newVerse; ne change en aucune façon $xmlDoc. SimpleXML est suffisant pour lire XML, pour la manipulation, vous pouvez choisir une alternative plus puissante de http://www.php.net/manual/de/refs.xml.php, par ex. DOM.

+1

Cette réponse est fausse à plusieurs égards. xpath() retourne un tableau d'objets, chaque objet "référence" le noeud dans le document original. Ce n'est pas une "copie" (ou clone) du noeud. SimpleXML est parfait pour lire et écrire du XML générique, DOM gère les opérations liées au DOM. Ce n'est pas "plus puissant" c'est juste un objectif différent. La génération de XML est beaucoup plus simple et moins verbeuse avec SimpleXML. La manipulation de documents DOM est plus facile avec DOM. –

+0

@Josh Davis: Les valeurs retournées se comportent comme des références, mais en fait elles ne font pas référence à des objets réels mais à des ressources système. Par conséquent, vous ne pouvez pas manipuler '$ xmlDoc', sauf pour changer les attributs et c'est plutôt un effet secondaire de l'interface de tableau exposée. – rik