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 :

DOMDocument pour création de xml


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut DOMDocument pour création de xml
    Je tente de boucler sur un résultat de requête pour générer une sortie XML

    le résultat de requête a cette structure :

    produit nom_pdf type_pdf prive_pdf
    1 ENTREE_AIR_AUTO_RE_FR_FR_28143161 Rapport d essai 0
    1 M_FT_FR_FR_201803 Fiche technique 0
    100 AMD+C_FT_FR_FR_201901 Fiche technique 0
    1000 APDR_FT_FR_FR_201907 Fiche technique 0
    1000 ATTESTATION_A1_CONVENTIONNELS Procès-verbal 1


    la sortie XML doit avoir cette structure :
    Code XML : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <Products>
    <product code="A010251">
    <Fichiers>
    <Fichier nom_fichier = "" type_fichier = "" prive = ""/>
    <Fichier nom_fichier = "" type_fichier = "" prive = ""/>
    <Fichier nom_fichier = "" type_fichier = "" prive = ""/>
    </Fichiers>
    </product>
    <product code="A010251">
    <Fichiers>
    <Fichier nom_fichier = "" type_fichier = "" prive = ""/>
    <Fichier nom_fichier = "" type_fichier = "" prive = ""/>
    <Fichier nom_fichier = "" type_fichier = "" prive = ""/>
    </Fichiers>
    </product>
    </products>

    J'ai donc ce code 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
    $xml = new DOMDocument('1.0', 'UTF-8');
    $xml->preserveWhiteSpace = false;
    $xml->formatOutput = true;
    $Products = $xml->createElement('Products');
     
     
        while($prod_line = mysqli_fetch_array($res)){
     
                if ( $prod_line['produit'] !== $prevprod ){ //product start
                        $product = $xml -> createElement('product');
                        $product -> setAttribute("code", $prod_line['produit']);
     
                        $Fichiers = $xml -> createElement('Fichiers');
     
                            $fichier = $xml -> createElement('fichier');
     
                            $fichier -> setAttribute("nom_fichier", $prod_line['nom_pdf'] );
                            $fichier -> setAttribute("type_fichier", $prod_line['type_pdf'] );
                            $fichier -> setAttribute("prive", $prod_line['prive_pdf'] );
     
                }
     
                else { //same product
     
                            $fichier = $xml -> createElement('fichier');
     
                            $fichier -> setAttribute("nom_fichier", $prod_line['nom_pdf'] );
                            $fichier -> setAttribute("type_fichier", $prod_line['type_pdf'] );
                            $fichier -> setAttribute("prive", $prod_line['prive_pdf'] );
     
     
                    }
     
            $Fichiers -> appendChild($fichier);                
            $product ->  appendChild($Fichiers);
            $Products -> appendChild($product);    
     
     
            $prevprod = $prod_line['produit'];
     
        }
    $xml -> appendChild($Products);
    $xml->formatOutput = true;
    echo $xml->saveXML();
    J'ai un triangle des bermudes à la sortie car il me sort cette structure:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8"?>
    <Products>
    <product code="A010251">
    <Fichiers>
    <Fichier nom_fichier = "" type_fichier = "" prive = "">
      <Fichier nom_fichier = "" type_fichier = "" prive = "">
         <Fichier nom_fichier = "" type_fichier = "" prive = "">
         </Fichier>
      </Fichier>
    </Fichier>
     
    </Fichiers>
    </product>

    Lorsque le code produit est identique à la ligne précédents il est supposé rajouter une balise <fichier> dans la balise <Fichiers> du produit...
    Mais en fait il rajoute une balise <fichier> comme enfant de la précédente balise fichier ?????
    Je ne m'explique pas ce comportement ????
    Voyez vous la source de cette erreur?

    Ce qui me semble d'autant plus étrange c'est que les autres appendChild sont corrects,

    Quelle sont les autres possibilités pour créer une structure XML dans une boucle ?

    Je peux toujours concaténer les string complet ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    J'explore la piste du navigateur qui semblerait ne pas interpréter correctement les balises autofermante ...
    Quand j'ai généré le XML en mode concaténation de texte avec les imbrications sont correctes ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    Je confirme, sous Brave, et ce sans doute à cause de l'ajoute de plugins qui viennent rajouter de éléments dans le DOM, bine que la page ait un header xml, la page comporte des balise html head et body, et les balises auto fermantes ne sont pas interprétées correctement.
    Le code généré par le php est bien correct

    Je clos donc le ticket, après avoir perdu une demi journée la dessus.
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  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
    Indépendamment de ton problème, ça peut être l'occasion d'utiliser XMLWriter à la place de DOMDocument:
    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
    $csv = <<<'CSV'
    produit nom_pdf type_pdf prive_pdf
    1 ENTREE_AIR_AUTO_RE_FR_FR_28143161 Rapport_d_essai 0
    1 M_FT_FR_FR_201803 Fiche_technique 0
    100 AMD+C_FT_FR_FR_201901 Fiche_technique 0
    1000 APDR_FT_FR_FR_201907 Fiche_technique 0
    1000 ATTESTATION_A1_CONVENTIONNELS Procès-verbal 1
    CSV;
     
    $lines = explode("\n", $csv);
     
    $headers = str_getcsv(array_shift($lines), ' ');
     
    $xw = new XMLWriter();
    $xw->openMemory();
    $xw->startDocument("1.0", "utf-8");
    $xw->setIndent(true);
    $xw->setIndentString('    ');
    $xw->startElement('Products');
     
    $prevprod = false;
     
    foreach ( $lines as $line ) {
        $data = array_combine($headers, str_getcsv($line, ' '));
     
        if ( $data['produit'] !== $prevprod ) {
            if ( $prevprod ) $xw->endElement();
            $prevprod = $data['produit'];
     
            $xw->startElement('produit');
            $xw->writeAttribute('code', $data['produit']);
        }
     
        $xw->startElement('Fichier');
        $xw->writeAttribute('nom_fichier', $data['nom_pdf']);
        $xw->writeAttribute('type_fichier', $data['type_pdf']);
        $xw->writeAttribute('prive', $data['prive_pdf']);
        $xw->endElement();
    }
     
    $xw->endElement(); // product (last)
    $xw->endElement(); // Products
    $xw->endDocument();
     
    echo $xw->outputMemory();
    demo

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    Merci Cosmo
    J'avais regardé XMLWriter, mais opté pour DOMDocument et fini par faire de la concaténation de texte pur m'apercevoir que mon premier code était valide. Je vais également tester XMLWriter pour ma culture personnelle.

    Quels en sont les avantages selon toi ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  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
    Selon moi ça devrait être plus rapide car cette extension n'a pas à construire tout un tas d'objets que nécessite DOMDocument, mais c'est pure spéculation, je n'ai pas testé. J'aime bien aussi ses possibilités de gestion du cache d'affichage.

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    Merci Cosmo
    J'avais regardé XMLWriter, mais opté pour DOMDocument et fini par faire de la concaténation de texte pur m'apercevoir que mon premier code était valide. Je vais également tester XMLWriter pour ma culture personnelle.

    Quels en sont les avantages selon toi ?
    Sur de petits documents , où la performance n'est pas importante , il y'a assez peu d'avantage à utiliser XMLWriter/Reader , DomDocument étant bien plus conviviale.
    En revanche dès que les documents grossissent et/ou que les performances sont importantes XMLWriter/Reader est largement au dessus. DomDocument va consommer des centainres de Mo de ram là ou XmlWriter/Reader consommera quelques centaines de kilo ...
    XMLWriter c'est "juste" un wrapper de la librairie c libxml d'où ses performances.

    Mais la vrai question c'est surtout pourquoi encore faire du XML en 2021
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 350
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 350
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    Je confirme, sous Brave, et ce sans doute à cause de l'ajoute de plugins qui viennent rajouter de éléments dans le DOM, bine que la page ait un header xml, la page comporte des balise html head et body, et les balises auto fermantes ne sont pas interprétées correctement.
    Tu peux faire ceci le temps du développement pour éviter les <fichier/> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $xml->saveXML(null, LIBXML_NOEMPTYTAG);

  9. #9
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    Bien vu Séb.

    La question que je me pose du coup c'est " le temps du développement " seulement ?
    Il faut que je voie avec l'utilisateur du XML généré si cela lui pose un souci particulier d'avoir des balises fermantes et pas juste des auto fermantes.

    Merci à tous !
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  10. #10
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 350
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 350
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    La question que je me pose du coup c'est " le temps du développement " seulement ?
    Je croyais que la visu du XML dans le navigateur c'était juste pour toi pour le développement.
    C'est dommage qu'un navigateur ou une extension dégradent ton contenu, tant pis pour l'utilisateur j'ai envie de dire
    Tu as vu pour le Content-Type comme proposé par CosmoKnacki ? Cela évitera peut-être aux extensions de trifouiller la data.

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

Discussions similaires

  1. [XML] problème pour création flux xml
    Par lelectronique.com dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 21/12/2011, 14h32
  2. Création d'une macro pour générer un xml depuis excel
    Par vieri dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/12/2011, 09h46
  3. [XML] Probleme pour création de liens
    Par mackean dans le forum Dynamique
    Réponses: 0
    Dernier message: 07/03/2008, 14h35
  4. VBScript : création base Access pour import fichier XML
    Par abertaud dans le forum VBA Access
    Réponses: 3
    Dernier message: 02/04/2007, 14h35
  5. VBScript : création base Access pour import fichier XML
    Par abertaud dans le forum VBScript
    Réponses: 1
    Dernier message: 02/04/2007, 14h34

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