Page 1 sur 1

Mise en forme XML avec SImpleXMLElement

Posté : 24 nov. 2014, 12:53
par BaLiSTiK
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 :)

Re: Mise en forme XML avec SImpleXMLElement

Posté : 24 nov. 2014, 13:31
par @rthur
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

Re: Mise en forme XML avec SImpleXMLElement

Posté : 24 nov. 2014, 14:38
par BaLiSTiK
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

Re: Mise en forme XML avec SImpleXMLElement

Posté : 24 nov. 2014, 14:54
par @rthur
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

Re: [RESOLU] Mise en forme XML avec SImpleXMLElement

Posté : 25 nov. 2014, 16:31
par BaLiSTiK
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