50 votes

Objet PHP en tant que document XML

Quelle est la meilleure façon de prendre un objet PHP donné et de le sérialiser au format XML ? Je regarde simple_xml et je l'ai utilisé pour analyser le XML en objets, mais je ne sais pas comment cela fonctionne dans l'autre sens.

53voto

philfreo Points 12382

Je suis d'accord pour utiliser le XML_Serializer de PEAR, mais si vous voulez quelque chose de simple qui supporte les objets/rays dont les propriétés sont imbriquées, vous pouvez utiliser ceci.

class XMLSerializer {

    // functions adopted from http://www.sean-barton.co.uk/2009/03/turning-an-array-or-object-into-xml-using-php/

    public static function generateValidXmlFromObj(stdClass $obj, $node_block='nodes', $node_name='node') {
        $arr = get_object_vars($obj);
        return self::generateValidXmlFromArray($arr, $node_block, $node_name);
    }

    public static function generateValidXmlFromArray($array, $node_block='nodes', $node_name='node') {
        $xml = '<?xml version="1.0" encoding="UTF-8" ?>';

        $xml .= '<' . $node_block . '>';
        $xml .= self::generateXmlFromArray($array, $node_name);
        $xml .= '</' . $node_block . '>';

        return $xml;
    }

    private static function generateXmlFromArray($array, $node_name) {
        $xml = '';

        if (is_array($array) || is_object($array)) {
            foreach ($array as $key=>$value) {
                if (is_numeric($key)) {
                    $key = $node_name;
                }

                $xml .= '<' . $key . '>' . self::generateXmlFromArray($value, $node_name) . '</' . $key . '>';
            }
        } else {
            $xml = htmlspecialchars($array, ENT_QUOTES);
        }

        return $xml;
    }

}

3 votes

C'est bien, ça marche très bien pour moi, surtout si vous ne voulez pas de dépendances de PEAR.

0 votes

Quelqu'un peut-il donner un exemple d'utilisation de ce système ? J'ai vraiment du mal.

2 votes

@MattBoyle, j'ai utilisé json_decode pour obtenir le simpleXML en tant qu'objet. Essayez ceci avec votre objet. $xml_generater = new XMLSerializer; $std_class = json_decode(json_encode($object)); $xml = $xml_generater->generateValidXmlFromObj($std_class);

39voto

phatduckk Points 1291

Jetez un coup d'œil à la page du PEAR XML_Serializer paquet. Je l'ai utilisé avec d'assez bons résultats. Vous pouvez lui fournir des tableaux, des objets, etc. et il les transformera en XML. Il a aussi un tas d'options comme le choix du nom du noeud racine, etc.

Cela devrait faire l'affaire

3 votes

J'essaie d'utiliser ce paquet aujourd'hui (4 ans après cette réponse) sur php 5.3.13 et j'obtiens des erreurs de normes strictes sur XML_Serializer et ses dépendances. Connaissez-vous d'autres alternatives ?

4 votes

Attention, la bibliothèque a d'horribles dépendances !

10voto

significance Points 1085

Ce n'est pas tout à fait une réponse à la question originale, mais la façon dont j'ai résolu mon problème avec ceci était en déclarant mon objet comme :

$root = '<?xml version="1.0" encoding="UTF-8"?><Activities/>';
$object = new simpleXMLElement($root); 

par opposition à :

$object = new stdClass;

avant de commencer à ajouter des valeurs !

0 votes

Lorsque vous avez terminé, il suffit d'appeler le asXML() pour obtenir le XML généré, ou pour le xml interne utiliser children()->asXml() génial !

7voto

Till Points 14673

Utilisez une fonction dom pour le faire : http://www.php.net/manual/en/function.dom-import-simplexml.php

Importez l'objet SimpleXML, puis enregistrez. Le lien ci-dessus contient un exemple :)

En un mot :

<?php
$array = array('hello' => 'world', 'good' => 'morning');

$xml = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><foo />");
foreach ($array as $k=>$v) {
  $xml->addChild($k, $v);
}
?>

1 votes

Je ne pense pas que cela réponde à la question, je suis presque sûr qu'il veut faire quelque chose comme convertir array("foo" => "bar") en "<xml><foo>bar</foo></xml>" (pas exactement, mais vous voyez l'idée).

0 votes

Vous pouvez remplir un objet simplexml ?

0 votes

Mais il n'a pas demandé comment convertir des objets simplexml en xml, il voulait des objets XML simples. À moins que j'aie mal compris, je n'ai pas vu de moyen facile de transformer une structure de données PHP arbitraire (objets, tableaux, chaînes, etc.) en un objet simplexml (et donc en une chaîne XML).

2voto

user22960 Points 61

Utiliser WDDX : http://uk.php.net/manual/en/wddx.examples.php

(si cette extension est installée)

il est consacré à cela :

http://www.openwddx.org/

1 votes

"www.openwddx.org est à vendre."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X