0

Here is my xml file

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

I need edit the second title <title>Podcasting Hacks</title> to <title>Podcasting Pops</title> using php script.

Anyone give me a suggestion to do this. Thanks

Prabhu
  • 1,127
  • 1
  • 13
  • 30

1 Answers1

1

file '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);           
?>

file '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());
     }

  }
?>
realization
  • 587
  • 1
  • 4
  • 5