[RESOLU] Mise en forme XML avec SImpleXMLElement

Eléphant du PHP | 398 Messages

24 nov. 2014, 12:53

Bonjour,

Pour faire un XML, j'utilise SimpleXMLElement, ça me ressort un beau XML bien comme il faut, sauf quand je le lis dans un éditeur de texte ou tout est sur une même ligne...ce qui est un peu chiant pour la lecture :).
Je voudrai savoir si y'a moyen de faire une mise en page automatique ou les balises sont envoyés à la ligne et avec tabulations.
J'ai vu qu'il était possible d'utiliser tidy de cette façon :
    $confTidy = array(
        'indent' => true,
        'wrap' => 200
    );

    $tidy = new tidy();
    $tidy->parseString($xml, $confTidy, 'utf8');
    $tidy->cleanRepair();

    echo $tidy;
Mais Tidy n'est pas chargée dans la config du php.ini apparemment, et je n'ai pas les accès pour le faire. Donc y'a t'il une autre solution pour faire de la mise en page ?

Merci d'avance :)
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

24 nov. 2014, 13:31

Bonjour,

Avec DOM tu as l'option formatOutput qui devrait correspondre à ce que tu cherches.

Exemple d'utilisation et résultat :
http://codepad.org/hbS5iOQD
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 398 Messages

24 nov. 2014, 14:38

Bonjour,

Avec DOM tu as l'option formatOutput qui devrait correspondre à ce que tu cherches.

Exemple d'utilisation et résultat :
http://codepad.org/hbS5iOQD
Nickel !! je ne voulais pas utiliser DOMDocument car j'étais parti sur SimpleXMLElement, mais je pense que je vais faire un gros refactoring de mon code :) (un script de récuperation de données depuis ez publish et à transformer en Excel XML...demande d'un client pour le format...).
merci
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

24 nov. 2014, 14:54

Nickel !! je ne voulais pas utiliser DOMDocument car j'étais parti sur SimpleXMLElement [...]
L'avantage de PHP c'est que tu as toujours moyen de t'en sortir et que tu as des passerelles un peu partout qui sont super pratiques.
Par exemple, pour passer de SimpleXML à DOM, il y a juste dom_import_simplexml() à appeler ;-)
http://fr.php.net/dom_import_simplexml
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 398 Messages

25 nov. 2014, 16:31

Oui, j'ai du l'utiliser justement car j'ai du créé une classe SimpleXMLElementExtended qui hérite de SimpleXMLElement pour pouvoir ajouter des CDATA dans mes noeuds.

Si ça peut être utile :
/**
 * Class SimpleXMLElementExtended
 * Surcouche de SimpleXMLElement pour ajouter des données html avec CDATA
 * Source : https://github.com/youngguns-nl/moneybird_php_api/blob/master/SimpleXMLElement.php
 */
class SimpleXMLElementExtended extends SimpleXMLElement
{

    /**
     * Add CDATA text in a node
     * @param string $cdata_text The CDATA value  to add
     */
    private function addCData($cdata_text)
    {
        $node= dom_import_simplexml($this);
        $no = $node->ownerDocument;
        $node->appendChild($no->createCDATASection($cdata_text));
    }

    /**
     * Create a child with CDATA value
     * @param string $name The name of the child element to add.
     * @param string $cdata_text The CDATA value of the child element.
     */
    public function addChildCData($name, $cdata_text, $attributes = array())
    {

        $child = $this->addChild($name);
        $child->addCData($cdata_text);
        $child->addAttribute('xmlns', 'http://www.w3.org/TR/REC-html40');
        if (isset($attributes)) {
            foreach ($attributes as $key=>$attribute) {
                $child->addAttribute($key, $attribute);
            }
        }
    }
}
Par contre, la solution de repasser par DOmDocument a l'air de retirer des sauts de lignes présent en tant que valeurs dans des noeuds, mais à vérifier
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe