2013-03-01 39 views
0

這裏是我的xml文件我想修改xml文件中已有的數據使用PHP

<books> 
    <book> 
     <author>Jack Herrington</author> 
     <title>PHP Hacks</title> 
     <publisher>O'Reilly</publisher> 
    </book> 
    <book> 
     <author>Jack Herrington</author> 
     <title>Podcasting Hacks</title> 
     <publisher>O'Reilly</publisher> 
    </book> 
</books> 

我需要使用PHP腳本編輯的第二個冠軍頭銜<title>Podcasting Hacks</title><title>Podcasting Pops</title>

任何人都給我一個建議來做到這一點。由於

+1

是否需要是你要編輯的動態(值總是不同的,這是一個例子)還是靜態的(你總是需要改變相同的值)? – AmazingDreams 2013-03-01 11:21:15

+0

請參閱此問題:http://stackoverflow.com/q/3577641/1919238 – 2013-03-01 11:21:35

+2

您可以使用[SimpleXML](http://php.net/manual/en/book.simplexml)將XML加載到PHP對象中。 PHP)。您可以操作該對象,然後再將該對象作爲XML寫入文件。你需要的只是SimpleXML。 – 2013-03-01 11:21:57

回答

1

文件 'test.php的':

<?php 
include 'books.php'; 
$b=new books(); 
//1. load books from xml to array 
$arr=$b->load('books.xml');   

//2. modify title 
for($i=0,$ms=count($arr);$i<$ms;$i++) 
{ 
    if($arr[$i]['fields']['title']=='Podcasting Hacks') 
    { 
    $arr[$i]['fields']['title']='Podcasting Pops'; 
    } 
} 

//3. save array to xml 
$b->save('out.xml',$arr);   
?> 

文件 'books.php':

<?php 
    class books 
    { 
    //load books from xml to array 
    public function load($fname) 
    { 
     $doc=new DOMDocument(); 

     if($doc->load($fname)) $res=$this->parse($doc); 
     else     throw new Exception('error load XML'); 

     return $res; 
    } 


    private function parse($doc) 
    { 
     $xpath = new DOMXpath($doc); 
     $items = $xpath->query("book"); 
     $result = array(); 
     foreach($items as $item) 
     { 
      $result[]=array('fields'=>$this->parse_fields($item)); 
     } 
     return $result; 
    } 


    private function parse_fields($node) 
    { 
     $res=array(); 
     foreach($node->childNodes as $child) 
     { 
      if($child->nodeType==XML_ELEMENT_NODE) 
      { 
       $res[$child->nodeName]=$child->nodeValue; 
      } 
     } 
     return $res; 
    } 


    //save array to xml 
    public function save($fname, $rows) 
    { 
     $doc = new DOMDocument('1.0','utf-8'); 
     $doc->formatOutput = true; 

     $books = $doc->appendChild($doc->createElement('books')); 

     foreach($rows as $row) 
     { 
      $book=$books->appendChild($doc->createElement('book')); 
      foreach($row['fields'] as $field_name=>$field_value) 
      { 
       $f=$book->appendChild($doc->createElement($field_name)); 
       $f->appendChild($doc->createTextNode($field_value)); 
      } 
     } 

     file_put_contents($fname, $doc->saveXML()); 
    } 

    } 
?>