152 lines
3.6 KiB
PHP
152 lines
3.6 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* @package Joomla.Platform
|
||
|
* @subpackage Registry
|
||
|
*
|
||
|
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
|
||
|
* @license GNU General Public License version 2 or later; see LICENSE
|
||
|
*/
|
||
|
|
||
|
defined('JPATH_PLATFORM') or die;
|
||
|
|
||
|
/**
|
||
|
* XML format handler for JRegistry.
|
||
|
*
|
||
|
* @package Joomla.Platform
|
||
|
* @subpackage Registry
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
class JRegistryFormatXML extends JRegistryFormat
|
||
|
{
|
||
|
/**
|
||
|
* Converts an object into an XML formatted string.
|
||
|
* - If more than two levels of nested groups are necessary, since INI is not
|
||
|
* useful, XML or another format should be used.
|
||
|
*
|
||
|
* @param object $object Data source object.
|
||
|
* @param array $options Options used by the formatter.
|
||
|
*
|
||
|
* @return string XML formatted string.
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public function objectToString($object, $options = array())
|
||
|
{
|
||
|
$rootName = (isset($options['name'])) ? $options['name'] : 'registry';
|
||
|
$nodeName = (isset($options['nodeName'])) ? $options['nodeName'] : 'node';
|
||
|
|
||
|
// Create the root node.
|
||
|
$root = simplexml_load_string('<' . $rootName . ' />');
|
||
|
|
||
|
// Iterate over the object members.
|
||
|
$this->getXmlChildren($root, $object, $nodeName);
|
||
|
|
||
|
return $root->asXML();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Parse a XML formatted string and convert it into an object.
|
||
|
*
|
||
|
* @param string $data XML formatted string to convert.
|
||
|
* @param array $options Options used by the formatter.
|
||
|
*
|
||
|
* @return object Data object.
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public function stringToObject($data, array $options = array())
|
||
|
{
|
||
|
$obj = new stdClass;
|
||
|
|
||
|
// Parse the XML string.
|
||
|
$xml = simplexml_load_string($data);
|
||
|
|
||
|
foreach ($xml->children() as $node)
|
||
|
{
|
||
|
$obj->$node['name'] = $this->getValueFromNode($node);
|
||
|
}
|
||
|
|
||
|
return $obj;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Method to get a PHP native value for a SimpleXMLElement object. -- called recursively
|
||
|
*
|
||
|
* @param object $node SimpleXMLElement object for which to get the native value.
|
||
|
*
|
||
|
* @return mixed Native value of the SimpleXMLElement object.
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
protected function getValueFromNode($node)
|
||
|
{
|
||
|
switch ($node['type'])
|
||
|
{
|
||
|
case 'integer':
|
||
|
$value = (string) $node;
|
||
|
return (int) $value;
|
||
|
break;
|
||
|
case 'string':
|
||
|
return (string) $node;
|
||
|
break;
|
||
|
case 'boolean':
|
||
|
$value = (string) $node;
|
||
|
return (bool) $value;
|
||
|
break;
|
||
|
case 'double':
|
||
|
$value = (string) $node;
|
||
|
return (float) $value;
|
||
|
break;
|
||
|
case 'array':
|
||
|
$value = array();
|
||
|
foreach ($node->children() as $child)
|
||
|
{
|
||
|
$value[(string) $child['name']] = $this->getValueFromNode($child);
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
$value = new stdClass;
|
||
|
foreach ($node->children() as $child)
|
||
|
{
|
||
|
$value->$child['name'] = $this->getValueFromNode($child);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return $value;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Method to build a level of the XML string -- called recursively
|
||
|
*
|
||
|
* @param SimpleXMLElement $node SimpleXMLElement object to attach children.
|
||
|
* @param object $var Object that represents a node of the XML document.
|
||
|
* @param string $nodeName The name to use for node elements.
|
||
|
*
|
||
|
* @return void
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
protected function getXmlChildren(SimpleXMLElement $node, $var, $nodeName)
|
||
|
{
|
||
|
// Iterate over the object members.
|
||
|
foreach ((array) $var as $k => $v)
|
||
|
{
|
||
|
if (is_scalar($v))
|
||
|
{
|
||
|
$n = $node->addChild($nodeName, $v);
|
||
|
$n->addAttribute('name', $k);
|
||
|
$n->addAttribute('type', gettype($v));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$n = $node->addChild($nodeName);
|
||
|
$n->addAttribute('name', $k);
|
||
|
$n->addAttribute('type', gettype($v));
|
||
|
|
||
|
$this->getXmlChildren($n, $v, $nodeName);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|