Skip to content

Instantly share code, notes, and snippets.

@evaisse
Last active September 28, 2016 10:49
Show Gist options
  • Select an option

  • Save evaisse/483937c02ffe4c317d483fcd0163b543 to your computer and use it in GitHub Desktop.

Select an option

Save evaisse/483937c02ffe4c317d483fcd0163b543 to your computer and use it in GitHub Desktop.
Hash / Object / Array to XML using XmlWriter
<?php
/**
* User: evaisse
* Date: 28/09/2016
* Time: 12:45
*/
/**
* @see https://dev.kafol.net/2008/09/php-xml-generator.html
* Usage :
*
* $xml = new XmlGenerator();
* echo $xml->generate('my-tag-name', $myData);
*
*/
class XmlGenerator
{
/**
* @var XMLWriter
*/
protected $xml;
/**
* @var string xml version string ("1.0")
*/
protected $ver;
/**
* @var string $charset xml charset ("UTF-8")
*/
protected $charset;
/**
* @param string $ver xml version string ("1.0")
* @param string $charset xml charset ("UTF-8")
*/
function xmlgen($ver = '1.0', $charset = 'UTF-8')
{
$this->ver = $ver;
$this->charset = $charset;
}
/**
* @param string $root root tag name
* @param array|object $data data to convert
* @return string xml string
*/
function generate($root, $data = array())
{
$this->xml = new XmlWriter();
$this->xml->openMemory();
$this->xml->startDocument($this->ver, $this->charset);
$this->xml->startElement($root);
$this->xml->setIndent(true);
$this->xml->setIndentString(' ');
$this->write($this->xml, $data);
$this->xml->endElement();
$this->xml->endDocument();
$xml = $this->xml->outputMemory(true);
$this->xml->flush();
return $xml;
}
/**
* @param XMLWriter $xml xml writer instance
* @param array|object $data data to append to current writer
*/
protected function write(XMLWriter $xml, $data)
{
foreach ($data as $key => $value) {
if (is_integer($key) && (is_array($value) || is_object($value))) {
$xml->startElement('item');
$this->write($xml, $value);
$xml->endElement();
} else if (is_integer($key)) {
$xml->writeElement("item$key", $value);
} else if (is_array($value) || is_object($value)) {
$xml->startElement($key);
$this->write($xml, $value);
$xml->endElement();
} else {
$xml->writeElement($key, $value);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment