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:
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:
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:
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 ...