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

Langage PHP Discussion :

Analyser du code XML [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Par défaut Analyser du code XML
    Bonjour,

    Décidément, moi et les regex...

    Je dispose sur serveur d'un vieux PHP 4 sans l'extension domxml, et je n'ai pas la main sur la configuration. J'essaie donc de récupérer les contenus des noeuds d'un fichier XML via expressions régulières, et un preg_match_all().

    Supposons le XML suivant, dans une variable PHP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $monXML = '<BIEN>
    <NB_PIECES>1</NB_PIECES>
    <SURF_HAB>25,5</SURF_HAB>
    <SURF_SEJOUR>23</SURF_SEJOUR>
    <SURF_TERRAIN>0</SURF_TERRAIN>
    <ETAGE>2</ETAGE>
    </BIEN>';
    A l'aide du code PHP suivant, je tente de récupérer les contenus des balises :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function xmlGetContenuNoeud($leXml,$nomNoeud)
    {
    	$pattern = '/\<'.$nomNoeud.'\>(.*)\<\/'.$nomNoeud.'\>/i';	
    	$count = preg_match_all($pattern,$leXml,$out);	
    	return($out);
    }
     
    $contenu = xmlGetContenuNoeud($monXML,'ETAGE');
    Ici, je récupère correctement le contenu de la balise ETAGE, dans le XML.

    Mais là où ça ne fonctionne plus, c'est quand je cherche à récupérer le contenu complet contenu entre <BIEN> et </BIENS>, en appliquant le même code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $contenu = xmlGetContenuNoeud($monXML,'BIEN');
    ... car il y a de nombreux "BIENS" dans ce XML, et je souhaiterais les traiter un par un.
    Là, ça ne me retourne plus rien.

    J'ignore pourquoi : est-ce parce que cette balise, contrairement aux autres, va à la ligne après son ouverture ? Dois-je améliorer ma Regex ?....

    Merci à vous si vous avez quelques pistes.

  2. #2
    Membre éclairé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Par défaut
    Oui ca doit venir de la , si tu traites le fichier ligne par ligne ca ne pourra pas marcher

  3. #3
    Membre éclairé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755

  4. #4
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Salut,

    Les regex sont greedy par défaut. Il faut les freiner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function xmlGetContenuNoeud($leXml,$nomNoeud)
    {
    	$pattern = sprintf('#<%1$s>(.*?)</%1$s>#si', $nomNoeud);
    	$count = preg_match_all($pattern,$leXml,$out);
    	return($out);
    }
    --- edit ---

    il faut aussi passer en mode DOT_MATCH_ALL en utilisant le flag s

  5. #5
    Membre averti
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Par défaut
    Merci les gars,
    Tout cela m'a fait bien avancer, je suis débloqué

    Clem

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XML] Analyse de code XML dans une chaine de caractères
    Par yannick29000 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 28/07/2010, 16h46
  2. [XML] Analyse code XML
    Par rajrouj dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 30/06/2010, 21h16
  3. Outil d'analyse de code
    Par Bloon dans le forum Outils
    Réponses: 8
    Dernier message: 07/08/2007, 10h04
  4. Analyse de code HTML et simplification par l'XML
    Par Punky65250 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 10/11/2005, 11h24
  5. Cherche lien info... sur l'analyse du code
    Par Alec6 dans le forum Qualimétrie
    Réponses: 3
    Dernier message: 03/03/2004, 15h44

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