fbpx

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 !

Anis Berejeb

Anis est avant tout un passioné de l'agilité et du développement. Avec plus de 15 ans dans le domaine du développement web, son expertise combine des connaissances accrues dans l'ensemble des notions partant du développement logiciel jusqu'à l'organisation des équipes dans les environnements agiles à grande échelle.

You may also like...