IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[SimpleXML] Analyse XML : tester la présence d'un attribut dans une boucle


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11
    Points : 7
    Points
    7
    Par défaut [SimpleXML] Analyse XML : tester la présence d'un attribut dans une boucle
    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 :
    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
     
    <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
    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
     
    	//	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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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 :

    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
     
    (
        [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

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Après une petite soirée pépère je me suis repenché sur le problème. La tête à froid ça aide. En fait, c'est tout simple, j'ai presque honte de donner la solution

    Remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $part2.= $key['Id'] ? ", '".$value['Id']."'" : ", '".addslashes($value)."'";
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $part2.= isset($value['Id']) ? ", '".$value['Id']."'" : ", '".addslashes($value)."'";
    C'est tellement simple que j'en ai honte On va mettre ça sur le compte de la fatigue due à une journée à fond tête dans le guidon ^^

    Merci quand même

Discussions similaires

  1. Tester la présence de plusieurs mots dans une phrase
    Par Azerty32 dans le forum Général Python
    Réponses: 20
    Dernier message: 30/07/2010, 17h15
  2. [MySQL] Tester la présence d'un élément dans une table
    Par une_tite_question dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/09/2008, 14h47
  3. Tester la présence d'un attribut dans une BD
    Par michouhayoo dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 26/04/2008, 15h57
  4. Tester la présence d'un enregistrement dans une table ?
    Par Evocatii dans le forum Requêtes
    Réponses: 5
    Dernier message: 25/02/2008, 21h02
  5. Tester la présence d'un caractère dans une chaine
    Par sebinator dans le forum VBA Access
    Réponses: 2
    Dernier message: 15/11/2007, 14h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo