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

Langage PHP Discussion :

PHP to XML avec DOMDocument [PHP 5.6]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué Avatar de slozano
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Mars 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 12
    Par défaut PHP to XML avec DOMDocument
    Bonjour,
    c'est la première fois que je poste sur developpez.net.
    Je rencontre un problème qui n'en est peut être pas un mais je ne trouve pas de réponse.

    Description :
    Je génére un fichier XML à l'aide de la librairie DOMDocument de PHP, voici le code minimal, ce n'est pas le code réel, je l'ai simplifié au maximum pour poser ma question.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
    $date = date("Y-m-M");
    $filename = testCreaBiens-'.$date.'.xml';
       $xml = new DOMDocument('1.0', 'utf-8');
       $tag = $xml->createElement('items','contenu de la balise');
       $xml->appendChild($tag);
       echo $xml->saveXML();
       $xml->save($filename);
     ?>
    Pas de problème, le fichier XML est correctement généré.
    Simplement lorsque je télécharge et que j'ouvre le dit fichier XML j'ai sur la dernière ligne le poids du fichier. Je mets en pièce jointe ce fichier mais voici son contenu.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <?xml version="1.0" encoding="utf-8"?>
    <items>contenu de la balise</items>
    75
    Le fichier pèse 75 octets, j'ai un 75 sur la dernière ligne.

    Questions
    1. Du coup mon fichier XML est-il valide ?
    2. Ai-je loupé quelque chose dans la documentation ?
    3. Cela risque-t-il de poser problème au traitement ultérieur du fichier par un parseur XML?



    En espérant avoir été suffisamment clair et concis.
    Merci d'avance pour votre aide
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Réponses:
    1. Non.
    2. Je ne sais pas.
    3. Oui.




    Montre ton code réel, c'est sûrement là que le problème se cache.

  3. #3
    Membre habitué Avatar de slozano
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Mars 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 12
    Par défaut
    Merci pour ce retour.
    En fait, mon code fonctionne, il fait bien ce que je veux mais j'ai cette information du nombre d'octets écrite en fin de fichier à chaque fois.
    Dans la documentation de la methode , il est indiqué qu'elle retourne le nombre d'octets écrit ou FALSE si une erreur survient, ce que je veux c'est uniquement sauver l'arbre et pas son poids.

    En fait, le code que j'ai mis est la partie de code qui me pose question et qui reproduit le problème.

    Mais voici mon code en cours de développement, qui fonctionne et me récupère les valeurs des champs d'un formulaire pour les réécrire dans un fichier XML.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
     
    <?php
    // ===============================================================================
    // GESTION DES BIENS 
    // ===============================================================================
     
     
    // fonction pour créer le fichier XML des nouveaux biens
    function addBiens() {
        // date annéé et mois en chiffres puis mois en 3lettres afin d'avoir un fichier horodaté
        $date = date("Y-m-M");
        // date et heure courantes pour l'affichage
        $dateTimeEnClair = date("d/m/Y à H:i:s");
        // heure courante
        $time = date("H-i-s");
        $filename ='testCreaBiens-'.$date.'.xml';
     
     
        //fonction pour tester si un post est rempli et non vide et renvoit la variable avec un htmlspecialschars
        function postRempliNonVide($varPost) {
            if (isset($varPost) && !empty($varPost)) {
                return htmlspecialchars($varPost,ENT_QUOTES,'UTF-8');
            };
        };
        // on récupère les données du formulaire
        $suiviPar=postRempliNonVide($_POST["suiviPar"]);
        $ref=$_POST["reference"];
        $numMandat=$_POST["numMandat"];
        $statut=$_POST["statut"];
        if(isset($_POST["onoffswitch"])) { 
            $pubWeb="oui"; 
        }else{
            $pubWeb="non";
        };
        $couleur=$_POST["couleur"];
        $typeBien=$_POST["typeBien"];
        $destination=$_POST["destination"];
     
        if ($destination=="vente"){
     
            $nbPieces=$_POST["choixNbPiecesV"];
            $nbChambres=$_POST["choixNbChambresV"];
            $surface=$_POST["choixSurfaceV"];
            $surfaceTerrain=$_POST["choixSurfaceTerrainV"];
            $etage=$_POST["choixEtageV"];
            $etageTot=$_POST["choixEtageTotV"];
            $prixFraisVendeurCompris=$_POST["choixPrixFraisVendeurComprisV"];
            $fraisVendeur=$_POST["choixFraisVendeurV"];
            $pourcentFraisVendeur=$_POST["pourcentFraisVendeurV"];
            $fraisAcheteur=$_POST["choixFraisAcheteurV"];
            $pourcentFraisAcheteur=$_POST["pourcentFraisAcheteurV"];
            $prixVente=$_POST["choixPrixVenteV"];
            $fraisNotaire=$_POST["choixFraisNotaireV"];
            $resteVendeur=$_POST["choixResteVendeurV"];
            $tousFraisComprisV=$_POST["choixtousFraisComprisV"];
     
     
        } elseif ($destination=="location"){
     
            $nbPieces=$_POST["choixNbPiecesL"];
            $nbChambres=$_POST["choixNbChambresL"];
            $surface=$_POST["choixSurfaceL"];
            $surfaceTerrain=$_POST["choixSurfaceTerrainL"];
            $etage=$_POST["choixEtageL"];
            $etageTot=$_POST["choixEtageTotL"];
            $typeBail=$_POST["choixTypeBailL"];
            $loyerHorsCharges=$_POST["choixLoyerHorsChargesL"];
            $provision=$_POST["choixProvisionL"];
            $honorairesLocataires=$_POST["choixHonorairesLocatairesL"];
            $pourcentHonorairesLocataires=$_POST["pourcentHonorairesLocatairesL"];
            $depotGarantie=$_POST("choixDepotGarantieL");
            $negoEntremiseLocataire=$_POST["choixNegoEntremiseLocataireL"];
            $visiteDossierActeLocataire=$_POST["choixVisiteDossierActeLocataireL"];
            $etatLieuxLocataire=$_POST["choixEtatLieuxLocataireL"];
            $totalHonoLocataire=$_POST["choixTotalHonoLocataireL"];
            $negoEntremiseBailleur=$_POST["choixNegoEntremiseBailleurL"];
            $visiteDossierActeBailleur=$_POST["choixVisiteDossierActeBailleurL"];
            $etatLieuxBailleur=$_POST["choixEtatLieuxBailleurL"];
            $totalHonoBailleur=$_POST["choixTotalHonoBailleurL"];
            $totalHonoHorsTaxes=$_POST["choixTotalHonoHorsTaxesL"];
            $totalHonoToutesTaxesComprises=$_POST["choixTotalHonoToutesTaxesComprisesL"];
     
        };
     
        // si le fichier de biens du mois n'existe pas on le crée
        if (!file_exists($filename))
        {
     
            $doc = new DOMDocument('1.0', 'utf-8');
            $doc->preserveWhiteSpace = false;
            $doc->formatOutput = true;
     
            // on crée l'élément racine
            $biens = $doc->createElement('biens');
     
            // on crée les noeuds avec les post du formulaire
            include('noeudsBien.php');
     
            // on affecte le nouveau noeud bien à la racine
            $biens->appendChild($newBien);
     
            // on affecte le tout au document
            $doc->appendChild($biens);
     
            // on sauve dans le fichier
            $doc->save($filename);
        }else{
          // sinon on ajoute les éléments ici
          $doc = new DOMDocument('1.0', 'utf-8');
          $doc->preserveWhiteSpace = false;
          $doc->formatOutput = true;
          // on charge le fichier existant
          $doc->load($filename);
     
          // on ajoute les éléments ici
          // on crée les noeuds avec les post du formulaire
          include('noeudsBien.php');
     
          // on affecte le nouveau noeud bien à la racine
          $doc->documentElement->appendChild($newBien);
     
          // on sauve dans le fichier
          $doc->save($filename);
     
        };
     
    };
     
    // on appelle la fonction
    addBiens();
     // on redirige sur la page désirée 
     header('Location: '.$urlRacineSite.'/biensNouveaux.php'); 
    ?>
    et voici le fichier noeudsBien.php
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    <?php
            // on crée un premier noeud bien
            $newBien = $doc->createElement('bien');
     
            // on crée les enfants du noeud bien
            $newSuivi = $doc->createElement('suivi',$suiviPar);
            $newRef = $doc->createElement('reference',$ref);
            $newNumMandat = $doc->createElement('mandat',$numMandat);
            $newStatut = $doc->createElement('statut',$statut);
            $newPubWeb = $doc->createElement('pubWeb',$pubWeb);
            $newCouleur = $doc->createElement('couleur',$couleur);
            $newTypeBien = $doc->createElement('typeDeBien',$typeBien);
            $newDestination = $doc->createElement('destination',$destination);
     
            if ($destination=="vente"){
     
                    if ($nbPieces!="") {$new_nbPieces = $doc->createElement('nombreDePieces',$nbPieces);};
                    if ($nbChambres!="") {$new_nbChambres = $doc->createElement('nombreDeChambres',$nbChambres);};
     
                    $new_surface = $doc->createElement('surface',$surface);
                    $new_surfaceTerrain = $doc->createElement('surfaceTerrain',$surfaceTerrain);
                    $new_etage = $doc->createElement('etage',$etage);
                    $new_etageTot = $doc->createElement('nombreEtageTotal',$etageTot);
                    $new_prixFraisVendeurCompris = $doc->createElement('PrixFraisVendeurCompris',$prixFraisVendeurCompris);
                    $new_fraisVendeur = $doc->createElement('FraisVendeur',$fraisVendeur);
                    $new_pourcentFraisVendeur = $doc->createElement('pourcentFraisVendeur',$pourcentFraisVendeur);
                    $new_fraisAcheteur = $doc->createElement('FraisAcheteur',$fraisAcheteur);
                    $new_pourcentFraisAcheteur = $doc->createElement('pourcentFraisAcheteur',$pourcentFraisAcheteur);
                    $new_prixVente = $doc->createElement('PrixVente',$prixVente);
                    $new_fraisNotaire = $doc->createElement('FraisNotaire',$fraisNotaire);
                    $new_resteVendeur = $doc->createElement('ResteVendeur',$resteVendeur);
                    $new_tousFraisCompris = $doc->createElement('tousFraisCompris',$tousFraisCompris);
     
            } elseif ($destination=="location") {
     
            };
     
            // on affecte ses enfant au premier noeud bien
            $newBien->appendChild($newSuivi);
            $newBien->appendChild($newRef);
            $newBien->appendChild($newNumMandat);
            $newBien->appendChild($newStatut);
            $newBien->appendChild($newPubWeb);
            $newBien->appendChild($newCouleur);
            $newBien->appendChild($newTypeBien);
            $newBien->appendChild($newDestination);
     
            if ($destination=="vente"){
     
                    if ($nbPieces!="") {$newBien->appendChild($new_nbPieces);};
                    if ($nbChambres!="") {$newBien->appendChild($new_nbChambres);};
     
                    $newBien->appendChild($new_surface);
                    $newBien->appendChild($new_surfaceTerrain);
                    $newBien->appendChild($new_etage);
                    $newBien->appendChild($new_etageTot);
                    $newBien->appendChild($new_prixFraisVendeurCompris);
                    $newBien->appendChild($new_fraisVendeur);
                    $newBien->appendChild($new_pourcentFraisVendeur);
                    $newBien->appendChild($new_fraisAcheteur);
                    $newBien->appendChild($new_pourcentFraisAcheteur);
                    $newBien->appendChild($new_prixVente);
                    $newBien->appendChild($new_fraisNotaire);
                    $newBien->appendChild($new_resteVendeur);
                    $newBien->appendChild($new_tousFraisCompris);
     
     
     
            } elseif ($destination=="location") {
     
            };
     
    ?>

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Bah je ne vois rien dans le script que tu montres qui puisse ajouter je ne sais quoi après le xml, en tout cas, ce n'est pas la méthode DOMDocument::save() qui, certes, renvoie le nombre d'octets écrits dans le fichier cible, mais en aucun cas ne l'ajoute au fichier.

    Au passage, je trouve ton code bien long (avec une mention spéciale pour les 2 include du même contenu), il y a beaucoup de choses qui se répètent, tu dois pouvoir factoriser tout ça tout en ajoutant un contrôle drastique des données POST.

  5. #5
    Membre habitué Avatar de slozano
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Mars 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 12
    Par défaut
    Merci pour ton retour.

    Oui c'est bien ce qui me pose question.
    Je ne comprends pas pourquoi le nombre d'octets figure en fin de fichier lorsque j'appelle DOMDocument::save().

    D'ailleurs si je fais un echo avec la méthode DOMDocumment::saveXML() je n'ai pas le souci à l'affichage dans le navigateur, mais j'ai besoin d'enregistrer le fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
    $date = date("Y-m-M");
    $filename = testCreaBiens-'.$date.'.xml';
       $xml = new DOMDocument('1.0', 'utf-8');
       $tag = $xml->createElement('items','contenu de la balise');
       $xml->appendChild($tag);
       echo $xml->saveXML();
     ?>
    La factorisation est prévue ainsi que les contrôles des données POST.
    Mon formulaire est progressif, au début, il y a des données communes puis cela dépendra du type de bien et de sa destination, vente ou location.

    Lorsque je me suis rendu compte que le nombre d'octets était écrit en même temps que l'arbre XML, j'ai fait quelques recherches et j'ai testé avec un fichier minimal, celui de mon premier message, qui produit le même effet.

    Je voudrais résoudre ce problème avant de poursuivre car le fichier XML doit être valide or il ne l'est clairement pas avec cette donnée orpheline et sans balise du nombre d'octets.

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Et dans quel cadre constates-tu ce nombre, ç-à-d avec quoi ouvres-tu ton fichier xml?

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

Discussions similaires

  1. [DOM] php et xml avec domdocument
    Par zerros dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 17/04/2012, 14h13
  2. Lecture de fichier XML avec DOMDocument
    Par DeeVoiD dans le forum Langage
    Réponses: 5
    Dernier message: 31/12/2009, 11h40
  3. [DOM] Validation xml avec PHP
    Par thefaycal dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 26/01/2006, 21h15
  4. [XML] [EXPAT] Parser XML avec PHP
    Par glsn dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 20/12/2005, 12h29
  5. [XSLT] Utilisation de XML avec PHP dans le cadre d'un site
    Par nicolas66 dans le forum Bibliothèques et frameworks
    Réponses: 15
    Dernier message: 06/11/2005, 22h39

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