Friday, May 17, 2013

PHP Class for converting XML to Object and Object to XML

PHP Class for converting XML to Object and Object to XML

Sometimes in PHP we need to convert PHP object into XML string and vice versa. Conversion of XML string to PHP object is pretty simple. You just need to call simplexml_load_string() function (available in PHP 5+) and need to pass your XML string. This will return the object which you can use. The only requirement is your XML string need to be well-formed XML string otherwise PHP will through E_WARNING error message.
Conversion of Object into XML string is little bit tricky. We need to recursively parse the Object and need to create XML tags for object attributes (keys). I’m using XmlWriter class for that purpose. Three important methods of this class which I’m using is startElement(), endElement(), and writeElement(). We need to check the passed mixed variable in getObject2XML() method and add the XML tags with values one by one.

class ObjectAndXML {
 private static $xml;
 
 // Constructor
 public function __construct() {
  $this->xml = new XmlWriter();
  $this->xml->openMemory();
  $this->xml->startDocument('1.0');
  $this->xml->setIndent(true);
 }
 
 // Method to convert Object into XML string
 public function objToXML($obj) {
  $this->getObject2XML($this->xml, $obj);
 
  $this->xml->endElement();
 
  return $this->xml->outputMemory(true);
 }
 
 // Method to convert XML string into Object
 public function xmlToObj($xmlString) {
  return simplexml_load_string($xmlString);
 }
 
 private function getObject2XML(XMLWriter $xml, $data) {
  foreach($data as $key => $value) {
   if(is_object($value)) {
    $xml->startElement($key);
    $this->getObject2XML($xml, $value);
    $xml->endElement();
    continue;
   }
   else if(is_array($value)) {
    $this->getArray2XML($xml, $key, $value);
   }
 
   if (is_string($value)) {
    $xml->writeElement($key, $value);
   }
  }
 }
 
 private function getArray2XML(XMLWriter $xml, $keyParent, $data) {
  foreach($data as $key => $value) {
   if (is_string($value)) {
    $xml->writeElement($keyParent, $value);
    continue;
   }
 
   if (is_numeric($key)) {
    $xml->startElement($keyParent);
   }
 
   if(is_object($value)) {
    $this->getObject2XML($xml, $value);
   }
   else if(is_array($value)) {
    $this->getArray2XML($xml, $key, $value);
    continue;
   }
 
   if (is_numeric($key)) {
    $xml->endElement();
   }
  }
 }
}
?>
How to use it.
1. If you want to convert XML string into PHP object.

$obj = new ObjectAndXML();
 
$str = <<

    
     XYZ
        28
        Male
    
    
     ABC
        25
        Male
    

STR;
 
$recordsObj = $obj->xmlToObj($str);
echo '
'
; var_dump($recordsObj);   // Above code will give you this output on browser /* object(SimpleXMLElement)#3 (1) { ["person"]=> array(2) { [0]=> object(SimpleXMLElement)#4 (3) { ["name"]=> string(3) "XYZ" ["age"]=> string(2) "28" ["gender"]=> string(4) "Male" } [1]=> object(SimpleXMLElement)#5 (3) { ["name"]=> string(3) "ABC" ["age"]=> string(2) "25" ["gender"]=> string(4) "Male" } } } */   // If you want to access value of "name" tag under second "person" tag then you can use echo $recordsObj->person[1]->name; ?>
2. If you want to convert PHP object into XML string.

$obj = new ObjectAndXML();
 
$objData1 = new stdClass;
 
$objData1->records->person[0]->name = 'XYZ';
$objData1->records->person[0]->age = '28';
$objData1->records->person[0]->gender = 'Male';
 
$objData1->records->person[1]->name = 'ABC';
$objData1->records->person[1]->age = '25';
$objData1->records->person[1]->gender = 'Male';
 
echo $recordsXML = $obj->objToXML($objData1);
 
// Output will be
/*


 
  XYZ
  28
  Male
 
 
  ABC
  25
  Male
 

*/
 
$objData2 = new stdClass;
 
$objData2->records->person[0]->name[] = 'XYZ';
$objData2->records->person[0]->name[] = 'ABC';
$objData2->records->person[0]->name[] = 'PQR';
 
$objData2->records->person[1]->name[] = 'XYZ1';
$objData2->records->person[1]->name[] = 'ABC1';
$objData2->records->person[1]->name[] = 'PQR1';
 
echo $recordsXML = $obj->objToXML($objData2);
 
// Output will be
/*


 
  XYZ
  ABC
  PQR
 
 
  XYZ1
  ABC1
  PQR1
 

*/
 
$objData3 = new stdClass;
 
$objData3->records->person->name = 'XYZ';
$objData3->records->person->age = '28';
$objData3->records->person->gender = 'Male';
 
echo $recordsXML = $obj->objToXML($objData3);
 
// Output will be
/*


 
  XYZ
  28
  Male
 

*/
?>

No comments: