2010-11-30 8 views
1

Problème: Je veux tous les lieux d'une base de données et envelopper tous dans la balise <loc>, le code suivant met chaque emplacement dans une balise <loc>, ce qui conduit à plusieurs <loc> quand j'en ai seulement besoin. Je sais que ça se passe parce que c'est dans une boucle (la partie simpleXML), mais je n'ai aucune idée de comment la résoudre. Si je le retire de la boucle, il met simplement le premier emplacement dans la base de données (iirc).SimpleXML problème, enroulant une liste d'éléments dans un <tag>

L'alternative à ceci est juste echo "<xml>"; ce que je pensais être une mauvaise pratique, parce que rien n'aurait des éléments parents et enfants, et tout serait sur le même niveau.

J'apprécierais toute indication sur cette question, ainsi que des liens vers des informations pertinentes sur ce sujet.

Cordialement.

EDIT: Si ce n'était pas clair, je dois les mettre tous dans une seule balise loc, comme <loc>Row 1, Row 2</loc>. En ce moment, il donne <loc>Row 1</loc><loc>Row 2</loc>.

Répondre

1

Vous avez une boucle while qui parcourt chaque ligne. Vous allez faire tout ce qui est dans la boucle autant de fois qu'il y a de lignes. Vous allez donc créer autant d'éléments <loc> que de lignes, une pour chaque ligne.

La solution consiste à générer une chaîne contenant toutes les données de ligne à l'intérieur de la boucle while, puis à ajouter l'élément <loc> avec cette chaîne en dehors de la boucle. Cela provoque addChild() d'être appelé qu'une seule fois, créant ainsi un seul élément <loc>.

$location_data; 

if($r7){ //$r7 = If query was successfull..  
    while($row = mysqli_fetch_array($r7, MYSQLI_ASSOC)){ 
     $location_data .= $row['location'] . ' ,'; 
    } 
} 

$location_data = substr($location_data, 0, -2); // strip off the final space and comma 
$convXML_from_loc = $convXML_from->addChild('loc',$location_data); // will result in '<loc>Row 1, Row 2</loc>' 
+0

A bientôt, j'essaierai ça demain quand j'aurai de nouveau accès au code. '$ location_data. = $ row ['emplacement']. ','; 'met les rangs 1 et 2 dans une chaîne? – Daniel

+0

Cela a bien fonctionné, acclamations. – Daniel

1

Vous voulez dire quelque chose qui va générer le XML ci-dessous?

<loc> 
    <location>row 1</location> 
    <location>row 2</location> 
    <location>row 3</location> 
</loc> 

Essayez:

if($r7){ //$r7 = If query was successfull..  
    $loc = $convXML_from->addChild('loc'); // Add the <loc> tag 
    while($row = mysqli_fetch_array($r7, MYSQLI_ASSOC)){ 
     $loc->addChild('location',$row['location']); // Add a <location> with value 
    } 
} 

Compte tenu de votre explication, essayez:

if($r7){ //$r7 = If query was successful...  
    $locations = array(); 
    while($row = mysqli_fetch_array($r7, MYSQLI_ASSOC)){ 
     $locations[] = $row['location']); 
    } 

    $convXML_from->addChild('loc', implode(', ', $locations)); // Add the <loc> tag 
} 
+0

Non, désolé si ce n'était pas clair. Dans ma base de données il ya 2 lignes avec des emplacements sur eux, je dois les mettre tous dans une seule balise loc, comme ' Row 1, Row 2' – Daniel

+0

Je suis certain que votre deuxième exemple fonctionnerait, mais la réponse finale déjà travaillé, donc je n'ai pas eu le temps de l'essayer, upvoted, mais pas marqué comme meilleure réponse. – Daniel