Bonjour à tous,
Dans le cadre du développement d'une appli en PHP se raccordant à un logiciel métier, je dois parser un flux XML et l'insérer en BDD puis le comparer. Jusque là, rien d'énorme, mais je me retrouve bloqué sur une petite broutille ...
A un moment je dois parser un noeud contenant des sous objets (enfin si il y en a). Certains de ses noeuds possèdent un attribut "Id", d'autres non et mon code doit tester si l'id est présent, il récupère sa valeur pour constituer la requête, sinon il récupère la valeur du contenu du noeud.
Exemple de la portion de Flux à parser :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
<Pieces>
<Piece>
<Commentaires>ZSFSDF</Commentaires>
<Etage>2</Etage>
<Exposition Id="01">Nord</Exposition>
<RevetementSol Id="03">Linoléum</RevetementSol>
<Surface>20.00</Surface>
<Type Id="01">Chambre</Type>
<Vue Id="02">Cour</Vue>
</Piece>
<Piece>
<Commentaires>DFSDF</Commentaires>
<Etage>2</Etage>
<Exposition Id="01">Nord</Exposition>
<RevetementSol Id="04">Moquette</RevetementSol>
<Surface>40.00</Surface>
<Type Id="10">Séjour</Type>
<Vue Id="01">Rue</Vue>
</Piece>
</Pieces> |
le parseur
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
// BOUCLE SUR LE SOUS ELEMENT "PIECES" DE L'OBJET
$z = 0;
while($z < count($xml->Agence->Annonces->Annonce[$i]->Pieces->Piece) ){
// constitution de la requete du sous objet piece
$part1 = '';
$part2 = '';
// fais defiler les elements du sous objet piece en comparant les champs de la table
foreach($xml->Agence->Annonces->Annonce[$i]->Pieces->Piece[$z] as $key => $value){
if($value != NULL && in_array($key,$array_tbl_2)) {
$part1.= ', `'.$key.'`';
$part2.= $key['Id'] ? ", '".$value['Id']."'" : ", '".addslashes($value)."'";
}
}
// finalisation de la requete concernant le sous objet avec ajout de l'id du bien + execution
$req = 'INSERT INTO `'.$bdd_tampon.'`.`'.$tbl_tampon_pieces.'` (`idBien`'.$part1.') VALUES ('.$id_bien.$part2.') ;';
echo $req.'<br />';
$z++;
} |
Le problème se situe à ce niveau :
$part2.= $key['Id'] ? ", '".$value['Id']."'" : ", '".addslashes($value)."'";
La condition marche très bien. Il trouve les attribut et les affiche.
Si je vire la condition et que je met simplement un :
$part2.=", '".addslashes($value)."'";
pas de problème, il me met bien le contenu du noeud.
Le problème, c'est que je n'ai pas encore trouvé le moyen de faire cohabiter les 2. Si je teste les Id, il tentera de m'afficher tout le temps la valeur de l'attribut Id, et si l'attribut n'existe pas, ben il affichera un vide correspondant à ce noeud. Là où c'est incompréhensible, c'est que si on fait un print_r($value); dans la boucle, ça nous affichera bien les deux dans un array, par exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
(
[0] => ZSFSDF
)
SimpleXMLElement Object
(
[0] => 2
)
SimpleXMLElement Object
(
[@attributes] => Array
(
[Id] => 01
)
[0] => Nord
) |
Mais pas moyen de l'exploiter et de faire une condition là dessus.
J'utilise SimpleXMLElement comme vous pouvez le voir, et en faisant des recherches je n'ai pu trouver que ça à ce sujet :
->http://bugs.php.net/bug.php?id=44973
Un bug de PHP, le même que le mien.
Là, c'est un petit bout de code XML, donc à la rigueur je pourrai très bien mettre en dur les noms des noeuds et le problème serait réglé. Le hic, c'est qu'il faut vraiment que ça soit dynamique car je compare avec la structure de la table accueillant le flux. Et que là, il n'y a que quelques noeuds "fils", mais cette même technique de code doit s'appliquer sur un flux contenant près de 200 noeuds "fils" et le flux risque de changer de temps en temps (ajout de noeuds), d'où le test de la structure de la table.
Une idée ou une solution pour ce problème?
Merci d'avance à tous ceux qui répondront
Partager