Bonjour,

Voila je rencontre un petit problème, Je souhaite créer ou modifier un fichier XML schema au format Format de persistance avec des données provenant d'une base données mysql.
Je ne connais pas bien les fichiers XML donc je ne suis pas sur que cela soit la bonne définissions de ce que je cherche a faire ni si c'est possible de cette maniere.
J'essaye d'utiliser DocDocument pour créer le fichier XML, ça fonctionne mais le prologue (entete) ne convient pas, je suis donc parti sur une solution de modification du fichier (inserer des éléments) pour garder la partie entete et la partie schema puisque qu'elle ne change pas.

Le code ci-dessous insere des éléments dans le fichier XML mais les inserent a la fin du code et souhaiterais les inserer apres la balise schema.
Merci d'avance pour vos retours .
Pour info je suis débutant je connais un peu le html le css le php et le javascript j'ai bien dit un peu ;) mais pas le xml.

include '../inc/bdd.php';

$stagesall = $bdd->query('SELECT * FROM stages WHERE id ORDER BY date_creation_stage  DESC');

  $dom = new DOMDocument(''); // instancie un objet DomDocument
    $dom->formatOutput=true; //met au format xml au lieu de en ligne 
        $dom->load('new/STAGE.xml'); // Chargement d'un fichier XML

        // ici chercher le parent xml et inserer ou inserer apres Schema? <----ici

  $data = $dom->createElement('rs:data'); //creer l'element parent data
    $dom->appendChild($data); //creer l'element parent

    // ici chercher le parent data et inserer ou inserer apres data? <----ici

   // stage       
while ($row = $stagesall->fetch()) { //boucle pour recuperer la table stages
    $zrow = $dom->createElement('z:row'); //creer l'element fils du parent data
    $zrow->setAttribute('MatchId', $row['matchsid']); //creer attribute fils du parent z:row avec value from table
    $zrow->setAttribute('StageId', $row['numstage']); 
    $zrow->setAttribute('StageName', $row['nomstage']);
    $zrow->setAttribute('Location', ''); 
    $zrow->setAttribute('FirearmId', $row['FirearmId']); 
    $zrow->setAttribute('CourseId', $row['CourseId']); 
    $zrow->setAttribute('ScoringId', $row['ScoringId']); 
    $zrow->setAttribute('TrgtTypeId', $row['TrgtTypeId']); 
    $zrow->setAttribute('IcsStageId', $row['IcsStageId']); 
    $zrow->setAttribute('Remove', ''); 
    $zrow->setAttribute('TrgtPaper', $row['TrgtPaper']); 
    $zrow->setAttribute('TrgtPopper', $row['TrgtPopper']); 
    $zrow->setAttribute('TrgtPlates', $row['TrgtPlates']); 
    $zrow->setAttribute('TrgtVanish', $row['TrgtVanish']); 
    $zrow->setAttribute('TrgtPenlty', $row['TrgtPenlty']); 
    $zrow->setAttribute('ReportOn', $row['ReportOn']); 
    $zrow->setAttribute('MaxPoints', $row['MaxPoints']); 
    $zrow->setAttribute('StartPos', $row['StartPos']); 
    $zrow->setAttribute('StartOn', $row['StartOn']); 
    $zrow->setAttribute('StringCnt', $row['StringCnt']); 
    $zrow->setAttribute('Descriptn', $row['Descriptn']); 

    $data->appendChild($zrow); //creer l'element fils du parent data

}

echo "<xmp>" .$dom->saveXML()."</xmp>";

$dom->save("new/STAGE.xml") or die ("Error, Unnable to create XML file.");

Je souhaite avoir un fichier XML avec la bonne entète et le schema et inserer la partie data apres le schema mais avant la balise fermante xml de fin du fichier

Voici ce que j'obtiens (Je n'ai pas mis toute la partie schema ça faisait un peu beaucoup de code):
1 domDocument me rajoute l'entete xml version 1.0 dont je n'est pas besoin pire le fichier n'est pas valide.
2 il m'insere la partie data apres la balise fermante xml

<?xml version="1.0"?>
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
<s:Schema id="RowsetSchema">
    <s:ElementType name="row" content="eltOnly" rs:updatable="true">
        <s:AttributeType name="MatchId" rs:number="1" rs:nullable="true" rs:maydefer="true" rs:writeunknown="true" rs:basetable="tblMatchStage" rs:basecolumn="MatchId" rs:keycolumn="true">
            <s:datatype dt:type="int" dt:maxLength="4" rs:precision="10" rs:fixedlength="true"/>
        </s:AttributeType>
        <s:AttributeType name="StageId" rs:number="2" rs:nullable="true" rs:maydefer="true" rs:writeunknown="true" rs:basetable="tblMatchStage" 
        <s:AttributeType name="StartOn" rs:number="20" rs:nullable="true" rs:maydefer="true" rs:writeunknown="true" rs:basetable="tblMatchStage" rs:basecolumn="StartOn">
            <s:datatype dt:type="string" dt:maxLength="8"/>
        </s:AttributeType>
        <s:AttributeType name="StringCnt" rs:number="21" rs:nullable="true" rs:maydefer="true" rs:writeunknown="true" rs:basetable="tblMatchStage" rs:basecolumn="StringsOfFire">
            <s:datatype dt:type="ui1" dt:maxLength="1" rs:precision="3" rs:fixedlength="true"/>
        </s:AttributeType>
        <s:AttributeType name="Descriptn" rs:number="22" rs:nullable="true" rs:maydefer="true" rs:writeunknown="true" rs:basetable="tblMatchStage" rs:basecolumn="Description">
            <s:datatype dt:type="string" dt:maxLength="536870910" rs:long="true"/>
        </s:AttributeType>
        <s:extends type="rs:rowbase"/>
    </s:ElementType>
</s:Schema>
Je souhaite faire l'insersion ICI
    </xml>
    <rs:data>
  <z:row MatchId="24" StageId="6" StageName="2juukkkk" Location="" FirearmId="1" CourseId="1" ScoringId="1" TrgtTypeId="2" IcsStageId="" Remove="" TrgtPaper="7" TrgtPopper="1" TrgtPlates="0" TrgtVanish="0" TrgtPenlty="0" ReportOn="0" MaxPoints="95" StartPos="Exemple: Standing erect, facing downrange with arms hanging naturally by the sides." StartOn="0" StringCnt="0" Descriptn="Exemple: Engage targets as they become visible."/>
  <z:row MatchId="24" StageId="16" StageName="2juuk" Location="" FirearmId="1" CourseId="1" ScoringId="1" TrgtTypeId="2" IcsStageId="" Remove="" TrgtPaper="6" TrgtPopper="0" TrgtPlates="0" TrgtVanish="0" TrgtPenlty="0" ReportOn="0" MaxPoints="60" StartPos="Exemple: Standing erect, facing downrange with arms hanging naturally by the sides." StartOn="0" StringCnt="0" Descriptn="Exemple: Engage targets as they become visible."/>
  <z:row MatchId="24" StageId="16" StageName="" Location="" FirearmId="1" CourseId="1" ScoringId="1" TrgtTypeId="2" IcsStageId="" Remove="" TrgtPaper="6" TrgtPopper="0" TrgtPlates="0" TrgtVanish="0" TrgtPenlty="0" ReportOn="0" MaxPoints="60" StartPos="Exemple: Standing erect, facing downrange with arms hanging naturally by the sides." StartOn="0" StringCnt="0" Descriptn="Exemple: Engage targets as they become visible."/>
  <z:row MatchId="24" StageId="2" StageName="ccccccc" Location="" FirearmId="1" CourseId="1" ScoringId="1" TrgtTypeId="2" IcsStageId="" Remove="" TrgtPaper="2" TrgtPopper="0" TrgtPlates="0" TrgtVanish="0" TrgtPenlty="0" ReportOn="0" MaxPoints="20" StartPos="Exemple: Standing erect, facing downrange with arms hanging naturally by the sides." StartOn="0" StringCnt="0" Descriptn="Exemple: Engage targets as they become visible."/>
    </rs:data>

6 réponses


Soundboy39
Réponse acceptée

Moi je ferais plutôt comme çà (non testé) :

<?php 
if (isset($_POST['button'])) {   
    if(isset($_POST['id'])) {

        // Prepare la liste des posts id pour le where
        $index_count = 0;
        $post_id_list = array();
        foreach($_POST['ID'] as $post_id) {

            $post_id_list[':post_'.$index_count] = (int) $post_id;
            $index_count++;

        }

        // Execute la requete
        $stagesall = $bdd->prepare('SELECT * FROM stages where id IN ('.implode(',', array_keys($post_id_list)).')');
        $stagesall->execute( $post_id_list );

        $file_out = __DIR__ . "/WinMSS/";
        // $dir_out = "WinMSS";
        if (!file_exists($file_out)) {
            @mkdir($file_out);
        }
        $dir = $file_out;
        if (!file_exists($dir)) {
            mkdir($dir);
        }

        $file = $dir . "/STAGE.XML";

        $xml = "<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882' xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' xmlns:rs='urn:schemas-microsoft-com:rowset' xmlns:z='#RowsetSchema'><s:Schema id='RowsetSchema'></s:Schema><rs:data>";        

        foreach( $stagesall->fetchAll() as $id ) {

            $nomstage = $id['nomstage'];
            $numstage = $id['numstage'];
            $FirearmId = $id['FirearmId'];
            $TrgtTypeId = $id['TrgtTypeId'];
            $ScoringId = $id['ScoringId'];
            $StartOn = $id['StartOn'];
            $StartPos = $id['StartPos'];
            $Descriptn = $id['Descriptn'];
            $CourseId = $id['CourseId'];
            $matchsid = $id['matchsid'];
            $MaxPoints = $id['MaxPoints'];
            $MinRounds = $id['MinRounds'];
            $TrgtPaper = $id['TrgtPaper'];
            $TrgtPopper = $id['TrgtPopper'];
            $TrgtPlates = $id['TrgtPlates'];
            $TrgtPenlty = $id['TrgtPenlty'];
            $Location = $id['Location'];
            $StringCnt = $id['StringCnt'];
            $ReportOn = $id['ReportOn'];
            $IcsStageId = $id['IcsStageId'];
            $Remove = $id['Remove'];
            $TrgtVanish = $id['TrgtVanish'];   

            $item = "<z:row 
            MatchId     ='" . $matchsid . "' 
            StageId     ='" . $numstage . "' 
            StageName   ='" . addslashes($nomstage) . "' 
            Location    ='" . addslashes($Location) . "' 
            FirearmId   ='" . $FirearmId . "' 
            CourseId    ='" . $CourseId . "' 
            ScoringId   ='" . $ScoringId . "' 
            TrgtTypeId  ='" . $TrgtTypeId . "' 
            IcsStageId  ='" . $IcsStageId . "' 
            Remove      ='" . $Remove . "' 
            TrgtPaper   ='" . addslashes($TrgtPaper) . "' 
            TrgtPopper  ='" . addslashes($TrgtPopper) . "' 
            TrgtPlates  ='" . addslashes($TrgtPlates) . "' 
            TrgtVanish  ='" . addslashes($TrgtVanish) . "' 
            TrgtPenlty  ='" . addslashes($TrgtPenlty) . "' 
            MinRounds   ='" . $MinRounds . "' 
            ReportOn    ='" . $ReportOn . "' 
            MaxPoints   ='" . $MaxPoints . "' 
            StartPos    ='" . $StartPos . "' 
            StartOn     ='" . addslashes($StartOn) . "' 
            StringCnt   ='" . addslashes($StringCnt) . "' 
            Descriptn   ='" . addslashes($Descriptn) . "'
            />";  

            $xml .= $item;
        }
        $xml .= "</rs:data></xml>"; 

        file_put_contents($file, $xml);   

    }
}

çà peut être encore optimisé mais je pense que tu comprendra le principe.

Bonjour,

Il n'y a rien qui me choque au niveau de l'en-tête, si ce n'est que l'encodage n'est pas spécifié... je t'invite à jetter un oeil à la doc du constructeur de la classe DomDocument : https://www.php.net/manual/fr/domdocument.construct.php

Concernant la mauvaise position du bloc "rs:data", je pense que cela vient du fait qu'il est un enfant "direct" du document et non pas du bloc "xml". Tu semble l'avoir fait correctement pour le bloc "s:Schema ", donc procède de la même manière.

Et à titre personnel, je ferais le "$dom->appendChild($data)" après le while.

Voilà bon courage !

Nesyou75
Auteur

Bonjour et merci pour ta réponse Soundboy39.
Mais j'ai du mal m'exprimer.

J'ai choisi la solution de mettre a jour le document xml plutot que le créer entierement, pour garder la partie ci-dessous:

  <xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" 
      xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" 
      xmlns:rs="urn:schemas-microsoft-com:rowset" 
      xmlns:z="#RowsetSchema">

1 Mon probleme c'est que je souhaite ajouter la partie rs:data qui est parent de z:row, apres la balise fermante /s:Schema.
rs:data est effectivement fils de xml mais il faut que je recupere la balise xml dans une variable pour préciser quel est le parent et c'est que je ne parviens pas a faire et c'est ma question.
2 la commande "$dom = new DOMDocument();" créer automatiquement une entete xml mais il y en a deja une dans mon fichier.
il faudrait une commande genre : "$dom = update DOMDocument();"

Voici mon code pour l'instant mais évidement la commande /$xml = $dom->getElementByTagName('xml'); ne fonctionne et donc donne l'erreur suivante:
Call to a member function appendChild() on null in C:\wamp64\www\updateDomDocXMLWinMSS.php on line 49 sur la commande "$xml->appendChild($data);"

    <?php
    include '../inc/bdd.php';
    $stagesall = $bdd->query('SELECT * FROM stages WHERE id ORDER BY date_creation_stage  DESC');
      $dom = new DOMDocument(); // instancie un objet DomDocument
        $dom->formatOutput=true; //met au format xml au lieu de en ligne 
            $dom->load('new/STAGE.xml'); // Chargement d'un fichier XML
            $xml = $dom->getElementById('xml'); // chercher la balise xml       
            //$xml = $dom->getElementByTagName('xml'); // chercher la balise xml !ICI je ne trouve pas la bonne commande
      $data = $dom->createElement('rs:data'); //creer l'element parent data
     // $dom->appendChild($data); //creer l'element parent
       // stage       
    while ($row = $stagesall->fetch()) { //boucle pour recuperer la table stages
        $zrow = $dom->createElement('z:row'); //creer l'element fils du parent data
        $zrow->setAttribute('MatchId', $row['matchsid']); //creer attribute fils du parent z:row avec value from table
        $zrow->setAttribute('StageId', $row['numstage']); 
        $zrow->setAttribute('StageName', $row['nomstage']);
        $zrow->setAttribute('Location', ''); 
        $zrow->setAttribute('FirearmId', $row['FirearmId']); 
        $zrow->setAttribute('CourseId', $row['CourseId']); 
        $zrow->setAttribute('ScoringId', $row['ScoringId']); 
        $zrow->setAttribute('TrgtTypeId', $row['TrgtTypeId']); 
        $zrow->setAttribute('IcsStageId', $row['IcsStageId']); 
        $zrow->setAttribute('Remove', ''); 
        $zrow->setAttribute('TrgtPaper', $row['TrgtPaper']); 
        $zrow->setAttribute('TrgtPopper', $row['TrgtPopper']); 
        $zrow->setAttribute('TrgtPlates', $row['TrgtPlates']); 
        $zrow->setAttribute('TrgtVanish', $row['TrgtVanish']); 
        $zrow->setAttribute('TrgtPenlty', $row['TrgtPenlty']); 
        $zrow->setAttribute('ReportOn', $row['ReportOn']); 
        $zrow->setAttribute('MaxPoints', $row['MaxPoints']); 
        $zrow->setAttribute('StartPos', $row['StartPos']); 
        $zrow->setAttribute('StartOn', $row['StartOn']); 
        $zrow->setAttribute('StringCnt', $row['StringCnt']); 
        $zrow->setAttribute('Descriptn', $row['Descriptn']); 
        $data->appendChild($zrow); //creer l'element fils du parent data            }
     $xml->appendChild($data); //creer l'element parent
    echo "<xmp>" .$dom->saveXML()."</xmp>";
    $dom->save("new/STAGE.xml") or die ("Error, Unnable to create XML file.");
Nesyou75
Auteur

J'ai pu trouver une solution pour créer mon fichier XML et insérer des éléments.
Mais je souhaite maintenant récupérer les données d'une table correspondant aux IDs récupérés d'un post qui viennent d'une multi selection d'un boutton avec checkbox.
Pour ensuite faire une boucle et remplir le fichier xml avec les données récupérées, je sais pas du tout comment faire.
J'ai tester plein de choses des array des bindValue et d'autre je mélange un peu tout!!
Pour info la table contient des données type int et string:

Voici mon code pour l'instant qui ne fonctionne pas, si quelqu'un peut m’aiguiller merci d'avance:

<?php 
if (isset($_POST['button'])) {   
    if(isset($_POST['id'])) {       
        foreach ($_POST['id'] as $key => $value) {
            $stagesall = $bdd->prepare('SELECT * FROM stages where id = :id');
            $stagesall->bindValue('id', $id);
            $stagesall->execute(array(
            $nomstage = $id['nomstage'],
            $numstage = $id['numstage'],
            $FirearmId = $id['FirearmId'],
            $TrgtTypeId = $id['TrgtTypeId'],
            $ScoringId = $id['ScoringId'],
            $StartOn = $id['StartOn'],
            $StartPos = $id['StartPos'],
            $Descriptn = $id['Descriptn'],
            $CourseId = $id['CourseId'],
            $matchsid = $id['matchsid'],
            $MaxPoints = $id['MaxPoints'],
            $MinRounds = $id['MinRounds'],
            $TrgtPaper = $id['TrgtPaper'],
            $TrgtPopper = $id['TrgtPopper'],
            $TrgtPlates = $id['TrgtPlates'],
            $TrgtPenlty = $id['TrgtPenlty'],
            $Location = $id['Location'],
            $StringCnt = $id['StringCnt'],
            $ReportOn = $id['ReportOn'],
            $IcsStageId = $id['IcsStageId'],
            $Remove = $id['Remove'],
            $TrgtVanish = $id['TrgtVanish'],
            ));     

        }

        $file_out = __DIR__ . "/WinMSS/";
        // $dir_out = "WinMSS";
        if (!file_exists($file_out)) {
            @mkdir($file_out);
        }
        $dir = $file_out;
        if (!file_exists($dir)) {
            mkdir($dir);
        }

        $file = $dir . "/STAGE.XML";

        $xml = "<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882' xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' xmlns:rs='urn:schemas-microsoft-com:rowset' xmlns:z='#RowsetSchema'><s:Schema id='RowsetSchema'></s:Schema><rs:data>";        

        while ($id = $stagesall->fetch()) {     

            $item = "<z:row 
            MatchId     ='" . $matchsid . "' 
            StageId     ='" . $numstage . "' 
            StageName   ='" . addslashes($nomstage) . "' 
            Location    ='" . addslashes($Location) . "' 
            FirearmId   ='" . $FirearmId . "' 
            CourseId    ='" . $CourseId . "' 
            ScoringId   ='" . $ScoringId . "' 
            TrgtTypeId  ='" . $TrgtTypeId . "' 
            IcsStageId  ='" . $IcsStageId . "' 
            Remove      ='" . $Remove . "' 
            TrgtPaper   ='" . addslashes($TrgtPaper) . "' 
            TrgtPopper  ='" . addslashes($TrgtPopper) . "' 
            TrgtPlates  ='" . addslashes($TrgtPlates) . "' 
            TrgtVanish  ='" . addslashes($TrgtVanish) . "' 
            TrgtPenlty  ='" . addslashes($TrgtPenlty) . "' 
            MinRounds   ='" . $MinRounds . "' 
            ReportOn    ='" . $ReportOn . "' 
            MaxPoints   ='" . $MaxPoints . "' 
            StartPos    ='" . $StartPos . "' 
            StartOn     ='" . addslashes($StartOn) . "' 
            StringCnt   ='" . addslashes($StringCnt) . "' 
            Descriptn   ='" . addslashes($Descriptn) . "'
            />";  

            $xml .= $item;
        }
        $xml .= "</rs:data></xml>"; 

        file_put_contents($file, $xml);   

    }
}
Nesyou75
Auteur

Bonjour a tous, je recherche toujours une solution a mon problème, si quelqu'un a une idée merci beaucoup...

Nesyou75
Auteur

Hello Soundboy39,
Merci pour ton aide cest bon cela fonctionne apres 2 petites modif dans le code.
Merci encore.