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

  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 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 644
    Points : 66 671
    Points
    66 671
    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 ...

  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 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 644
    Points : 66 671
    Points
    66 671
    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 ...

  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 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 644
    Points : 66 671
    Points
    66 671
    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.

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    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 912
    Points : 6 705
    Points
    6 705
    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 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 644
    Points : 66 671
    Points
    66 671
    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 ?

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    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 912
    Points : 6 705
    Points
    6 705
    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
    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 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 644
    Points : 66 671
    Points
    66 671
    Billets dans le blog
    1
    Par défaut
    Dans ce cas la version à l'ancienne en concaténation de texte devrait être encore plus performante car pas besoin de classe ni de lib ...

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    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 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Ah bah ça c'est sûr, mais en faisant ça, ça revient à travailler sans filet alors que XMLWriter ou DOMDocument t'en procure quand même un pour produire du XML conforme.

    À toi de voir si tu es sûr de ton coup. Tu peux même écrire une requête ou une procédure stockée si c'est trop complexe, pour produire directement ton xml avec MySQL.




    Je viens de penser à un truc concernant ton problème initial. Est-ce que tu as essayé d'envoyer un header au navigateur avant d'afficher le XML ? : header('Content-Type: application/xml'); (de cette manière, en connaissant la nature de ce qu'il reçoit, il ne tentera pas d'en faire du html à tout prix.)

  9. #9
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 269
    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 269
    Points : 8 568
    Points
    8 568
    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);

  10. #10
    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 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 644
    Points : 66 671
    Points
    66 671
    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 !

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

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    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

  12. #12
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 269
    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 269
    Points : 8 568
    Points
    8 568
    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.

  13. #13
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 269
    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 269
    Points : 8 568
    Points
    8 568
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par grunk Voir le message
    Mais la vrai question c'est surtout pourquoi encore faire du XML en 2021
    C'est vrai qu'entre JSON et CSV (toujours), ça fait une plombe que je n'ai pas touché du XML.

  14. #14
    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 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 644
    Points : 66 671
    Points
    66 671
    Billets dans le blog
    1
    Par défaut
    A priori c'est pour un Job Talent

  15. #15
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    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 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Citation Envoyé par grunk Voir le message
    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.
    Je ne mets pas XMLReader et XMLWriter dans le même sac.
    Pour une tâche de lecture (et surtout pour extraire une information planquée bien profondément dans l'arborescence) OK, par contre pour écrire un document ex nihilo, DOMDocument n'est pas spécialement pratique ou du moins pas plus que XMLWriter. Je pense que DOMDocument laisse cette impression parce qu'il semble plus familier.

    Mais la vrai question c'est surtout pourquoi encore faire du XML en 2021
    Probablement parce qu'on a pas trouvé mieux. Alors oui JSON c'est plus léger, c'est moins verbeux, mais c'est tout. XML c'est bien plus qu'un format de données, c'est tout un écosystème qui permet de définir la grammaire d'un document, de garantir son intégrité, de l'interroger, de le transformer en n'importe quoi. Va faire ça avec du JSON.
    Et puis plaisanterie mise à part, le XML est absolument partout.

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

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Probablement parce qu'on a pas trouvé mieux. Alors oui JSON c'est plus léger, c'est moins verbeux, mais c'est tout. XML c'est bien plus qu'un format de données, c'est tout un écosystème qui permet de définir la grammaire d'un document, de garantir son intégrité, de l'interroger, de le transformer en n'importe quoi. Va faire ça avec du JSON.
    Et puis plaisanterie mise à part, le XML est absolument partout.
    Définir la grammaire en json : json-schema.org
    Garantir l'intégrité : Résultat du parser + utilisation de linter , + validation du schema.
    L'interroger : Si tu fais référence à XPath , si le langage ou la lib utilisé prend en charge JSON correctement c'est inutile puisque tu peux bien aller chercher n'importe quel partie du document comme bon te semble. Il existe évidemment des trucs comme jsonpath si on tient absolument à avoir une syntaxe de requêtage proche de xpath.
    Le transformer : Si tu fais référence à XSLT , il existe des équivalence pour json mais effectivement pas de standard. C'est à peut près le seul intérêt que je pourrais trouver à xml.

+ 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, 15h32
  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, 10h46
  3. [XML] Probleme pour création de liens
    Par mackean dans le forum Dynamique
    Réponses: 0
    Dernier message: 07/03/2008, 15h35
  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, 15h35
  5. VBScript : création base Access pour import fichier XML
    Par abertaud dans le forum VBScript
    Réponses: 1
    Dernier message: 02/04/2007, 15h34

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