IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[DOM XML] Traitement XML avec php


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut [DOM XML] Traitement XML avec php
    Bonjour,

    Je me prends la tête depuis quelques jours sur le traitement un peu spécial d'un fichier XML. Voilà le topo:

    - Je poste un xml à un web service et je reçois en retour un fichier xml de réponse.
    - Je transforme ce fichier xml en un fichier xml à un seul niveau
    - J'utilise ce fichier xml un niveau pour remplir un fichier modèle

    J'ai créé la fonction suivante qui permet de transformer le xml en un array en gardant l'arborescence du xml.
    exemple:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <reponse>
        <node>
            <adress>toto</adress>
            <cp>00000</cp>
        </node>
        <node>
            <adress>tata</adress>
            <cp>00000</cp>
        </node>
    </reponse>

    Donnerait donc dans l'array:
    [response1_node1_adress1] => toto
    [response1_node1_cp1] => 00000
    [response1_node2_adress1] => tata
    [response1_node2_cp1] => 11111
    Le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?php
    function parseNode($node, $name, &$arr) {
        $child_count = 0;
        $children = $node->childNodes;
        $count = 0;
        $map = array();
        foreach ($children as $child) {
            if ($child->nodeType == XML_ELEMENT_NODE) {
                if (!isset($map[$child->nodeName])) $map[$child->nodeName] = 0;
                $map[$child->nodeName]++;
                parseNode($child, $name . "_" . $child->nodeName . $map[$child->nodeName],$arr);
                $count++;
            }
        }
        if ($count == 0) {
            $name = substr($name,1);
            if (! empty($node->nodeValue) ) $arr[$name] = $node->nodeValue;
            //$arr[$name] = $node->nodeValue;
        }
        return $arr;
    }
    $file = "fichier.xml";
    $dom = new DOMDocument;
    $dom->load($file);
    $arr = parseNode($dom->documentElement, "",$arr);
    echo "<pre>";
    print_r($arr);
    echo "</pre>";
    ?>
    le problème est que dans mon fichier xml j'ai certain noeud qui n'ont que des attributs et pas de text (textnode) que je dois aussi pouvoir récupérer et créer une entrée dans l'array.
    J'ai fait pas mal de test avec des getAttribute, mais je n'y arrive pas. Je pense être trop dans le code, et je dois prendre un peu de recul, et demander de l'aide pour arriver à mes fins.
    Pour ensuite réécrire un nouveau xml avec les informations de l'array, pas de problème, ni pour exploiter le nouveau xml pour remplir mes fichiers modèles. Je devrai pouvoir m'e sortir assez simplement
    sur ces deux dernières partie.

    J'espère donc que vous pourrez me filer un coup de patte sur la partie "remise sur un seul niveau".

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    D'abord, j'ai une tendance de déconseiller de faire ce genre de rendrement intermédiaire pour plusieurs raisons : le format intermédiaire est tellement singulier sans reglement rigoroux posera de problèmes futurs; il est à l'encontre d'interoperabilité; et surtout il ne semble pas nécessaire --- plutôt de mapper directement les données apportées par le xml aux fichiers finals ... Mais si vous insistez, ça peut le faire.

    Et puis, je ne suis tout à fait d'accord la façon de mettre en garde qu'on entame le procès avec l'argument $name="", il vaut mieux le faire autrement plus généralement valable (voir mes modifications apportées dessous)

    Pour tendir compt l'existence des données portées par les attributs, vous pouvez faire comme ça avec un format spécifique de signaler avec un @ au titre d'exemple --- vous pouvez le changer comme vous voulez puisque en tout cas c'est un format singulier sans règle...
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    function parseNode($node, $name, &$arr) {
        $child_count = 0;
        $children = $node->childNodes;
        $count = 0;
        $map = array();
     
    	if ($node->hasAttributes()) {
    		foreach ($node->attributes as $attr) {
    			$attrname = $attr->nodeName;
    			$attrvalue = $attr->nodeValue;
    			if ($name=='') {
    				$arr['@'.$attrname]=$attrvalue;
    			} else {
    				$arr[$name.'_@'.$attrname]=$attrvalue;
    			}
    		}
    	}
     
        foreach ($children as $child) {
            if ($child->nodeType == XML_ELEMENT_NODE) {
                if (!isset($map[$child->nodeName])) $map[$child->nodeName] = 0;
                $map[$child->nodeName]++;
                //change this logic to this.
    			if ($name=='') {
    				parseNode($child, $child->nodeName . $map[$child->nodeName],$arr);
    			} else {
    				parseNode($child, $name . "_" . $child->nodeName . $map[$child->nodeName],$arr);
    			}
                $count++;
            }
        }
        if ($count == 0) {
            //$name = substr($name,1);
            if (! empty($node->nodeValue) ) $arr[$name] = $node->nodeValue;
            //$arr[$name] = $node->nodeValue;
        }
        return $arr;
    }
    Par exemple, avec un xml comme ceci
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <reponse>
    	<node>
    		<adress>toto</adress>
    		<test id="a">test1</test>
    		<cp>00000</cp>
    	</node>
    	<node>
    		<adress>tata</adress>
    		<test id="b" />
    		<cp>00000</cp>
    	</node>
    </reponse>
    ça donne l'object array comme ceci:
    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Array
    (
        [reponse_node1_adress1] => toto
        [reponse_node1_test1_@id] => a
        [reponse_node1_test1] => test1
        [reponse_node1_cp1] => 00000
        [reponse_node2_adress1] => tata
        [reponse_node2_test1_@id] => b
        [reponse_node2_cp1] => 00000
    )

    Vous pouvez entamer le procès comme ça tout deux donnant des résultats sans anomalies.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $arr=parseNode($dom->documentElement, $dom->documentElement->nodeName,$arr);
    //ou sans "reponse_" prefixé
    //$arr=parseNode($dom->documentElement, "", arr);

    Voilà !

  3. #3
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    Wow ok. Je vais m'inspirer de votre code pour faire ma fonction. Je débute sur le traitement xml alors j'apprends ... Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XML] Récupérer les données d'un fichier XML sur URL avec php
    Par ValooWart dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 01/03/2013, 16h40
  2. [DOM] Création de fichier XML format spécifique avec PHP
    Par aurelie20 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 20/11/2012, 14h43
  3. Injecter automatiquement du xml dans Mysql avec php
    Par Max1000p dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 04/06/2012, 10h44
  4. [DOM] Validation xml avec PHP
    Par thefaycal dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 26/01/2006, 21h15
  5. [DOM XML][XSLT] Création d'un document XML avec PHP
    Par ToxiZz dans le forum Bibliothèques et frameworks
    Réponses: 21
    Dernier message: 16/01/2006, 17h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo