Bonjour,

Je souhaite créer un fichier XML schema au format Format de persistance avecdes 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.

J'ai essayé d'utiliser DocDocument pour créer le fichier XML, ça fonctionne mais le prologue ne convient pas.
Je souhaite créer un prologue au format de persistance, pensez-vous que cela soit possible?

Merci d'avance.

Voici une partie du code DomDocument:

<?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 

  $schema = $dom->createElement('s:Schema'); //creer l'element parent Schema
  $schema->setAttribute('id', 'RowsetSchema');
  $dom->appendChild($schema); //creer l'element parent Schema

  $elementType = $dom->createElement('s:ElementType'); //creer l'element fils elementType de schema
  $elementType->setAttribute('name', 'row');
  $elementType->setAttribute('content', 'eltOnly');
  $elementType->setAttribute('rs:updatable', 'true');
  $schema->appendChild($elementType); //creer l'element parent

// attributeType MatchId
  $attributeType = $dom->createElement('s:AttributeType'); //creer l'element fils AttributeType de ElementType
  $attributeType->setAttribute('name', 'MatchId');
  $attributeType->setAttribute('rs:number', '1');
  $attributeType->setAttribute('rs:nullable', 'true');
  $attributeType->setAttribute('rs:maydefer', 'true');
  $attributeType->setAttribute('rs:writeunknown', 'true');
  $attributeType->setAttribute('rs:basetable', 'tblMatchStage');
  $attributeType->setAttribute('rs:basecolumn', 'MatchId');
  $attributeType->setAttribute('rs:keycolumn', 'true');
  $elementType->appendChild($attributeType); //creer l'element parent

  $datatype = $dom->createElement('s:datatype'); //creer l'element fils datatype de elementType
  $datatype->setAttribute('dt:type', 'int');
  $datatype->setAttribute('dt:maxLength', '4');
  $datatype->setAttribute('rs:precision', '10');
  $datatype->setAttribute('rs:fixedlength', 'true');
  $attributeType->appendChild($datatype); //creer l'element parent


   // createElement extends
  $extends = $dom->createElement('s:extends'); //creer l'element fils datatype de elementType
  $extends->setAttribute('type', 'rs:rowbase');
   $elementType->appendChild($extends); //creer l'element paren

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

  //$dom->load('WinMSS_template/STAGE.xml'); // Chargement d'un fichier XML

   // 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']); 
	
	$data->appendChild($zrow); //creer l'element fils du parent data

 // $addbalisefin = $dom->createElement('</xml>'); //creer l'element parent Schema
 // $dom->appendChild($addbalisefin); //creer l'element parent Schema

}

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


$dom->save("STAGE.xml") or die ("Error, Unnable to create XML file.");
// $dom->validate();    //Validation d'un document XML




Voici un exemple de xml que je souhaite obtenir:

<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:ElementType>
</s:Schema>
<rs:data>
	<z:row MatchId='1' StageId='3' StageName='test3' Location='Ctcm-91' FirearmId='1' CourseId='1' ScoringId='1'
		 TrgtTypeId='2' IcsStageId='0' Remove='True' TrgtPaper='8' TrgtPopper='0' TrgtPlates='0' TrgtVanish='1' TrgtPenlty='1'
		 MinRounds='16' ReportOn='True' MaxPoints='80' StartPos='Standing erect, facing downrange, with arms hanging naturally by the sides.'
		 StartOn='10' StringCnt='0' Descriptn='Engage targets as they become visible.'/>
</rs:data>
</xml>



Voici un exemple de xml que j'obtient:

<?xml version=""?>
<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:extends type="rs:rowbase"/>
  </s:ElementType>
</s:Schema>
<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."/>
</rs:data>
 

Modifié par Nesyou75 (25 Mar 2020 - 13:25)
Modérateur
Bonjour,

apparement tu ecrases ton $xml à la fin de ton script (bye bye attributs):
 $xml = $dom->createElement('xml'); // <=== ici !
  $dom->appendChild($xml);

Modifié par gcyrillus (25 Mar 2020 - 12:08)
gcyrillus a écrit :
Bonjour,

apparement tu ecrases ton $xml à la fin de ton script (bye bye attributs):
 $xml = $dom-&gt;createElement('xml'); // &lt;=== ici !
  $dom-&gt;appendChild($xml);


C'était juste un test, J'ai remis le code tel que il fonctionne plus haut dans mon premier post.
stryk a écrit :
Hello,

PHP a déjà des méthodes natives pour traiter le XML, pas besoin de créer un élément 'DOM'.
Je pense notamment à SimpleXML -&gt; https://www.php.net/manual/fr/book.simplexml.php
Mais il y en a d'autres, et c'est assez facile de manipuler les éléments avec Smiley smile



Hello,
Merci pour l'info, mais simpleXML semble bien compliqué mais si je peut avoir l'entete que je veux (le prologue) je vais essayer.


Bon ça commence bien, apparemment SimpleXML n'est pas capable de lire le fichier:


<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>SimpleXMl</title>
</head>
<body>
	<div class="container">
		<h1>Test SimpleXMl 1</h1><br>
		<?php 
		if (file_exists('STAGE.xml')) {
			$xml = simplexml_load_file('STAGE.xml');

			echo "<pre>";
			print_r($xml);
			echo "</pre>";
		}else{
			echo "Le fichier n'a pas été trouvé";
		}
		?>
<h1>Test SimpleXMl 2</h1><br>
		<?php 
		if (file_exists('STAGE0.xml')) {
			$xml = simplexml_load_file('STAGE0.xml');

			echo "<pre>";
			print_r($xml);
			echo "</pre>";
		}else{
			echo "Le fichier n'a pas été trouvé";
		}
		?>
	</div>	
</body>



Résultat:

Test SimpleXMl 1
SimpleXMLElement Object
(
)
Test SimpleXMl 2
Le fichier n'a pas été trouvé

Modifié par Nesyou75 (25 Mar 2020 - 14:13)
Et comme ceci ?

$xml = simplexml_load_file('STAGE.xml');
$xmlString = $xml->asXML();
echo $xmlString 
J'ai peut être une solution,

Je modifie le fichier plutôt que le créer du début puisque le schema ne change jamais, par contre si quelqu'un peut m'aider a trouver la bonne méthode svp.

Lorsque je tente cette solution évidement il me créé les éléments a la suite donc après la balise fermante </xml>

j'essaie de chercher le parent de rsdata qui est xml a priori mais il n'affiche rien:

$xml = $dom->getElementsByTagName('xml');
foreach ($xml as $rsdata) {
    echo $rsdata->nodeValue, PHP_EOL;
}
die();


Voici mon code:

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

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

  $dom = new DOMDocument('1.0', 'utf-8'); // 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.");



et voici le résultat:

</s:Schema>
<rs:data>
---> Le code doit écrire ici <---
</rs:data>
</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>

Modifié par Nesyou75 (25 Mar 2020 - 21:10)
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 Smiley cligne :


<?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);   

    }
}
Hello a tous,
J'espère que votre confinement se passe bien, je suis toujours à la recherche d''une solution a mon problème svp.
Merci.