2010-12-12 6 views
1

simpleXML을 사용하여 XML 파일에서 노드의 내용을 변경하려고합니다. 나는 새로운 node-contents를위한 변수가 옳은 것을 포함하고 있음을 알고 있지만, 어떤 이유로 그것이 저장 될 때 파일은 변경되지 않는다. 저는 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 줄의 코드를 해독하려는 사람은 없습니다. –

답변

1

이 코드는 확실히에 당신이 원하는 일을하지 않는 것을 감히 말하고 있습니다 : PHP는 변수의 값을 변경

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

아무런 부작용이 없습니다. 즉, 어떤 특정 경우를 제외하고 $a = $b;을 수행하면 아무 일도 일어나지 않으며 그 중 하나가 아닙니다.

이 코드를 사용하여 실제로 달성하고자하는 것이 무엇인지 알 수 없습니다. 특정 <div/> 안에있는 (X) HTML을 바꾸려면 DOM을 사용하고 DOMDocumentFragment을 작성해야합니다. appendXML()을 사용하여 채우고 이전 <div/>으로 바꿉니다. 또는 new DOMDocument, loadXML()을 작성한 다음 이전 문서에 importNode()을 작성하고 이전 문서에 replaceChild()을 작성하십시오.

+0

감사합니다. 나는 분명히 혼란 스러웠다. 실제로 DOM을 사용하여 XML 노드의 내용을 변경해야하는 것 같습니다. 드로잉 보드로 돌아갑니다. – monotasker

+0

SimpleXML 또는 DOM을 사용하여 노드의 내용을 변경할 수는 있지만 XML 및 기타 DOM 작업을 삽입하려는 경우에는 반드시 DOM이 필요합니다. –

-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 문서를보다 쉽게 ​​조작 할 수 있습니다. –

+0

@Josh Davis : 반환 값은 참조와 비슷하게 동작하지만 실제로는 실제 객체가 아니라 시스템 리소스를 참조합니다. 따라서 속성 변경을 제외하고는'$ xmlDoc'을 조작 할 수 없으며 이것은 노출 된 배열 인터페이스의 부작용입니다. – rik

관련 문제