Utilisez XMLWriter pour generer du flux XML avec PHP
Une petite fonctionnalité qui peut tourner au petit cauchemar quand on gère du XML est le fait de transformer un tableau php en XML. En effet, on peut s’amuser a concaténer des chaines de caractères en itérant sur notre tableau. L’un des problèmes que vous pouvez rencontrer est l’encodage de vos données. Pour palier a ce problème, vous pouvez utiliser XMLWriter.
XMLWriter est une extension qui peut s’avérer aussi utile si vous voulez générer du flux de fichiers au format XML.
Voici une petite implémentation d’une toolbox qui transforme votre tableau associatif multi-niveau en xml. L’utilisation de cette classe est très simple :
$array = array('firstKey' => array('secondKey' => 'secondValue', 'thirdKey' => array('fourthKey' => 'fourthValue'), 'fifthKey' => 'fifthValue'), 'anotherKey' => 'anotherValue');
$string = toolbox_XMLWriter::toXML($array);
La méthode toXML prend 4 parametres dont 3 qui sont optionnels:
toXMl(array $array, $rootNode = 'properties', $includeHeader = true, $setIndent = false)
$array = votre tableau d’entree.
$rootNode = le noeud root contenant vos donnees
$includeHeader = indique si le header XML sera inclus ou pas dans le resultat
$setIndent = indique si la sortie sera indentee ou pas
class toolbox_XMLWriter
{
/**
* xmlWriter object
*
* @var XMLWriter
*/
private static $xmlWriter;
/**
* create nodes
*
* @param array $array
*/
private static function createElements(&$array)
{
foreach ($array as $key => $value)
{
if (is_array($value))
{
self::createElements($value);
}
else
{
self::$xmlWriter->startElement($key);
self::$xmlWriter->text($value);
self::$xmlWriter->endElement();
}
}
}
/**
* returns an XML string from an array
*
* @param array $array the input array.
* @param string $rootNode the root node.
* @param bool $includeHeader include the header or not
* @param bool $setIndent indent the code or not
* @return string the output string
*/
public static function toXMl(array $array, $rootNode = 'properties', $includeHeader = true, $setIndent = false)
{
self::$xmlWriter = new XMLWriter();
self::$xmlWriter->openUri('php://output');
if ($setIndent)
{
self::$xmlWriter->setIndent(true);
}
if ($includeHeader)
{
self::$xmlWriter->startDocument('1.0','UTF-8');
}
self::$xmlWriter->openMemory();
self::$xmlWriter->startElement($rootNode);
self::createElements($array);
self::$xmlWriter->endElement();
$batchXmlString = self::$xmlWriter->outputMemory(true);
if ($includeHeader)
{
self::$xmlWriter->endDocument();
}
return $batchXmlString;
}
}
Grosso modo, dans la méthode toXML, l’objet XMLWriter ouvre un flux mémoire avec la méthode openUri(‘php://output’) et openMemory(), apres y avoir ecrit ses éléments, il récupère le flux via la méthode outputMemory(). La méthode createElements s’occupe d’écrire récursivement les éléments du tableau.
Enjoy !
