[PHP] Gestion de fichier xml Le sujet est résolu

Tout ce qui concerne la programmation.
Répondre
Avatar de l’utilisateur
PengouinPdt
Contributeur
Contributeur
Messages : 1343
Inscription : 23 avr. 2016, 23:37
Localisation : 47/FR
Diaspora* : https://framasphere.org/u/hucste
Contact :
Status : Hors-ligne

Bonsoir, pour un de mes projets personnels de gestion de contenu, j'ai un fichier xml type :
Je n'arrive pas à le traiter correctement, du moins la partie concernant les éléments faisant partie de l'entite 'integrity'.

Le code - où je me plante - :

Code : Tout sélectionner

$this->datas = $this->builderDatas( $dom->getElementsByTagName( 'datas' ) );

            if( $this->action == 'version' ) {

                $elements = $dom->getElementsByTagName( 'datas' );

                $version = array();
                foreach($elements as $elm0) {

                    if($elm0->childNodes->length != null) {

                        foreach($elm0->childNodes as $elm1) {   # element level 1

                            $elm1_name = filter_var(strip_tags($elm1->nodeName), FILTER_SANITIZE_STRING);

                            if( $elm1_name != '#text') {

                                $version[$elm1_name] = array();

                                if($elm1_name == "zao" && $elm1->getAttribute('version')) $version[$elm1_name]['version'] = $elm1->getAttribute('version');

                                if($elm1->childNodes->length != null) {

                                    foreach($elm1->childNodes as $elm2) {   # element level 2

                                        $elm2_name = filter_var(strip_tags($elm2->nodeName), FILTER_SANITIZE_STRING);
                                        $elm2_value = filter_var(strip_tags($elm2->nodeValue), FILTER_SANITIZE_STRING);

                                        if($elm2_name != '#text') {

                                            $version[$elm1_name][$elm2_name] = array();

                                            if($elm2->childNodes->length != null) {

                                                //$version[$elm1_name][$elm2_name] = array();

                                                foreach($elm2->childNodes as $elm3) {

                                                    $elm3_name = filter_var(strip_tags($elm3->nodeName), FILTER_SANITIZE_STRING); var_dump($elm3_name);

                                                    if($elm3_name != '#text') {

                                                        //$version[$elm1_name][$elm2_name][$elm3_name] = array();

                                                        $elm3_value = filter_var(strip_tags($elm3->nodeValue), FILTER_SANITIZE_STRING);

                                                        $version[$elm1_name][$elm2_name][$elm3_name] = $elm3_value;

                                                    } else {

                                                        $version[$elm1_name][$elm2_name] = $elm2_value;
                                                    }


                                                }

                                            }



                                        }

                                        unset($elm2_name, $elm2_value);

                                    }
                                    unset($elm2);
                                }
                            }
                            unset($elm1_name);
                        }
                        unset($elm1);
                    }
                }
                unset($elm0);

                if(!empty($version)) $this->version = $version;

                unset($elements, $version);
            }

            $this->head1 = $this->builderDatas( $dom->getElementsByTagName( 'h1' ) );

		}
        else $this->datas = NULL;
Je n'arrive pas à, pour le tableau nommé 'version' :
- s'il y a un élément de niveau 3 ou plusieurs, alors nommer la clé|l'index par le biais de l'information 'nodeName' et lui attribuer la valeur ayant celle de 'nodeValue'
- sinon attribué la valeur nodeValue de l'élément de niveau 2 ...

En fait, j'arrive à traiter toutes les éléments jusqu'au niveau 2, mais pas niveau 3 !

Code : Tout sélectionner

array(3) {
  ["zao"]=>
  array(4) {
    ["version"]=>
    string(5) "0.1.5"
    ["date"]=>
    string(35) "2015-08-26 20:15:43.912878767 +0200"
    ["name"]=>
    string(25) "Z -> Another Object (web)"
    ["url"]=>
    string(32) "https://framagit.org/hucste/ZAO/"
  }
  ["h5bp"]=>
  array(3) {
    ["name"]=>
    string(16) "HTML5BoilerPlate"
    ["url"]=>
    string(29) "https://html5boilerplate.com/"
    ["version"]=>
    string(5) "5.2.0"
  }
  ["bootstrap"]=>
  array(4) {
    ["name"]=>
    string(9) "Bootstrap"
    ["url"]=>
    string(24) "https://getbootstrap.com"
    ["version"]=>
    string(5) "3.3.6"
    ["integrity"]=>
    string(261) "
            sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7
            sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS
            sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r
        "
  }
}
PengouinPdt { le seul, le vrai } ~ " Libre as a Pengouin "
- DIY - Debian Sid | Devuan Ceres
----
Ne réponds pas aux PM d'assistance
Avatar de l’utilisateur
PengouinPdt
Contributeur
Contributeur
Messages : 1343
Inscription : 23 avr. 2016, 23:37
Localisation : 47/FR
Diaspora* : https://framasphere.org/u/hucste
Contact :
Status : Hors-ligne

Bon, j'ai résolu mon problème ... de manière différente !
sans l'usage "array", et avec SimpleXML :

Le code :

Code : Tout sélectionner

        $xml = simplexml_load_file($this->file);

        if( strcmp( $xml->attributes()->id, $this->action ) == 0 ) $bool = true;

        if( $bool ) {

            $this->title = $this->builderDatas( (string) $xml->title );
            $this->description = $this->builderDatas( (string) $xml->description );

            if( $this->action == 'version' ) {

                $this->version = $xml->datas;

            }
            else {

                $datas = str_replace(array('<datas>', '</datas>'), '', $xml->datas->asXML());

                $this->datas = $this->builderDatas( $datas );

                $h1 = str_replace(array('<h1>', '</h1>'), '', $xml->datas->h1->asXML());
                $this->head1 = $this->builderDatas( $h1 );
            }

        }
PengouinPdt { le seul, le vrai } ~ " Libre as a Pengouin "
- DIY - Debian Sid | Devuan Ceres
----
Ne réponds pas aux PM d'assistance
Répondre