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 :
J'ai un triangle des bermudes à la sortie car il me sort cette structure:
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();
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 ...
Partager