source: spip-zone/_plugins_/rainette/trunk/inc/simplexml_to_array.php @ 77024

Last change on this file since 77024 was 77024, checked in by eric@…, 6 years ago

Correction du modèle infos_ville.
Utilisation de la nouvelle fonction simplexml_to_array().
Correction de rainette_afficher_direction() : il ne faut pas supprimer la fonction angle2direction() qui est utiliser par certains services.

  • Property svn:eol-style set to native
File size: 3.8 KB
Line 
1<?php
2/**
3 * Ce fichier contient la fonction surchargeable de transformation d'un XML en tableau PHP.
4 * Cette fonction est une réplication de la fonction homonyme de SPIP. Elle est dupliquée
5 * dans le plugin car la fonction SPIP n'est disponible qu'à partir de la version 3.0.10.
6 *
7 * @package SPIP\BOUSSOLE\Outils\XML
8 */
9
10
11if (!defined("_ECRIRE_INC_VERSION")) return;
12
13
14/**
15 * Transformation d'un texte XML ou d'un objet *SimpleXML* en tableau PHP.
16 *
17 * Si l'argument XML est un texte, il est au préalable converti en objet *SimpleXML*
18 * par la fonction `simplexml_load_string()`. Ensuite, c'est l'objet *SimpleXML* qui est
19 * traduit en tableau PHP à partir de la fonction `xmlObjToArr()`.
20 *
21 * @uses xmlObjToArr()
22 * @example
23 *      ```
24 * $page = recuperer_page($action);
25 * $convertir = charger_fonction('simplexml_to_array', 'inc');
26 * $tableau = $convertir(simplexml_load_string($page), false);
27 *
28 * ou
29 *
30 * $tableau = $convertir($page, false);
31 *      ```
32 *
33 * @param string|object $xml
34 *              XML à phraser et à transformer en tableau PHP. Le XML peut être fourni :
35 *
36 *              - soit comme une chaine de caractères représentant le texte XML lui-même,
37 *              - soit comme un objet XML produit à partir du texte par la fonction
38 *              `simplexml_load_string()` de PHP.
39 * @param bool $utiliser_namespace
40 *              Indicateur d'utilisation des namespaces dans le XML. Si aucun namespace n'est
41 *              utilisé dans le XML, il est préférable de forcer l'argument à `false` afin
42 *              d'éviter l'appel à la fonction `getDocNamespaces()`.
43 * @return array
44 */
45function inc_simplexml_to_array_dist($xml, $utiliser_namespace=false){
46        // Décoder la chaine en SimpleXML si pas deja fait
47        if (is_string($xml))
48                $xml = simplexml_load_string($xml);
49        return array('root'=>@xmlObjToArr($xml, $utiliser_namespace));
50}
51
52
53/**
54 * Transformation d'un objet *SimpleXML* en tableau PHP.
55 *
56 * @autor xaviered at gmail dot com 17-May-2012 07:00
57 *
58 * @param object $objet_xml
59 *              Objet *SimpleXML* à phraser et à transformer en tableau PHP.
60 * @param bool $utiliser_namespace
61 *              Indicateur d'utilisation des namespaces dans le XML. Si aucun namespace n'est
62 *              utilisé dans le XML, il est préférable de forcer l'argument à `false` afin
63 *              d'éviter l'appel à la fonction getDocNamespaces()`.
64 * @return array
65**/
66function xmlObjToArr($objet_xml, $utiliser_namespace=false) {
67
68        $tableau = array();
69
70        // Cette fonction getDocNamespaces() est longue sur de gros xml. On permet donc
71        // de l'activer ou pas suivant le contenu supposé du XML
72        if (is_object($objet_xml)) {
73                if (is_array($utiliser_namespace)){
74                        $namespace = $utiliser_namespace;
75                }
76                else {
77                        if ($utiliser_namespace)
78                                $namespace = $objet_xml->getDocNamespaces(true);
79                        $namespace[NULL] = NULL;
80                }
81
82                $name = strtolower((string)$objet_xml->getName());
83                $text = trim((string)$objet_xml);
84                if (strlen($text) <= 0) {
85                        $text = NULL;
86                }
87
88                $children = array();
89                $attributes = array();
90
91                // get info for all namespaces
92                foreach( $namespace as $ns=>$nsUrl ) {
93                        // attributes
94                        $objAttributes = $objet_xml->attributes($ns, true);
95                        foreach( $objAttributes as $attributeName => $attributeValue ) {
96                                $attribName = strtolower(trim((string)$attributeName));
97                                $attribVal = trim((string)$attributeValue);
98                                if (!empty($ns)) {
99                                        $attribName = $ns . ':' . $attribName;
100                                }
101                                $attributes[$attribName] = $attribVal;
102                        }
103
104                        // children
105                        $objChildren = $objet_xml->children($ns, true);
106                        foreach( $objChildren as $childName=>$child ) {
107                                $childName = strtolower((string)$childName);
108                                if( !empty($ns) ) {
109                                        $childName = $ns.':'.$childName;
110                                }
111                                $children[$childName][] = xmlObjToArr($child, $namespace);
112                        }
113                }
114
115                $tableau = array(
116                        'name'=>$name,
117                );
118                if ($text)
119                        $tableau['text'] = $text;
120                if ($attributes)
121                        $tableau['attributes'] = $attributes;
122                if ($children)
123                        $tableau['children'] = $children;
124        }
125
126        return $tableau;
127}
128
129?>
Note: See TracBrowser for help on using the repository browser.