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 :

Regex pour extraire des noeuds XML


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 43
    Points
    43
    Par défaut Regex pour extraire des noeuds XML
    Bonjour à toute la communauté,

    Je galère deséperement en ce moment avec une expression régulière qui devrait me permettre d'extraire d'un gros xml, des noeuds et de pusher ces noeuds dans un tableau pour pouvoir ensuite en faire ce que je veux.

    Voici à quoi ressemble mon xml :
    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
     
    <FACTURE LANG="fr">
    	<VENDEUR>
    		<NOM> 60003</NOM>
    		<ADRESSE>7 rue d'Atalantet<BR>CITIS<BR>14200 HEROUVILLE SAINT-CLAIR</ADRESSE>
    				<TEL>0 825 31 32 33</TEL>
    				<FAX>0 825 31 32 99</FAX>
    				<MAIL></MAIL>
    				<NOTEJURIDIQUE></NOTEJURIDIQUE>
    				<RC></RC>
    				<SIRET></SIRET>
    				<APE></APE>
    				<TVA></TVA>
    			</VENDEUR>
    			<ACHAT>
    				<MARCHE>0</MARCHE>
    				<REMISE>25</REMISE>
    				<PRIX_PUBLIC>16.37</PRIX_PUBLIC>
    			</ACHAT>
    			<ACHAT>
    				<REMISE>40.00</REMISE>
    				<PRIX_PUBLIC>44.06</PRIX_PUBLIC>
    				<REDUS>1</REDUS>
    			</ACHAT>
    			<ACHAT>
    				<RECALCULECLASS>produitPrix</RECALCULECLASS>
    				<REMISE>40.00</REMISE>
    				<PRIX_PUBLIC>3.5</PRIX_PUBLIC>
    			</ACHAT>
    			<ACHAT>
    				<RECALCULECLASS>produitPrix</RECALCULECLASS>
    				<REMISE>50.00</REMISE>
    				<PRIX_PUBLIC>9.74</PRIX_PUBLIC>
    			</ACHAT>
    		</FACTURE>
    Et je voudrais donc obtenir dans un tableau, les noeuds <ACHAT>....</ACHAT>, mais je n'y arrive pas pour le moment.

    Voici mon expression régulière (qui ne marche pas mais c une base) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eregi("<ACHAT\>(.*)</ACHAT>",$xml,$reg
    Merci de votre aide !!!!!!

  2. #2
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Salut,

    Dès l'introduction de ton sujet, je me suis posé la question suivante :

    Pourquoi ne pas utiliser simplexml ?

    Et je ne vois pas de contre-indication.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par FCYPBA Voir le message
    Salut,

    Dès l'introduction de ton sujet, je me suis posé la question suivante :

    Pourquoi ne pas utiliser simplexml ?

    Et je ne vois pas de contre-indication.
    Petit précision,

    Notre serveur tourne avec php4 je sais c pas bien mais j'ai pas le choix !!!

    J'ai pas du tout envie d'utiliser domXML.

    Donc je me retrourne vers les expressions régulières

  4. #4
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Dans ce cas là, je comprends parfaitement le souci qui se pose à toi.

    Pour en revenir aux expressions régulières, je te conseille tout d'abord de passer aux expressions perl ( fonctions preg_* )

    Ensuite ton cas est assez simple, on doit pouvoir le faire avec une expression du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match_all('¤<achats>(.*)</achats>¤miU',$xml,$donnees,PREG_SET_ORDER);
    j'explique rapidement :
    - ¤ est le délimiteur d'expressions régulières ( obligatoire ). Cela peut être n'importe quel caractère non présent dans la pattern.

    - l'expression en est même est des plus simple. (.*) capture tous les caractères jusqu'à rencontrer </achats>
    - miU sont des modificateurs : multiligne, insensible à la casse, expression non gourmande ( propre à PHP ). Le dernier modificateur est très important dans notre cas.

    - $donnees est un tableau contenant toutes les chaines capturées
    - PREG_SET_ORDER permet d'obtenir un tableau de résultats ordonné

    VOilà

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par FCYPBA Voir le message
    Dans ce cas là, je comprends parfaitement le souci qui se pose à toi.

    Pour en revenir aux expressions régulières, je te conseille tout d'abord de passer aux expressions perl ( fonctions preg_* )
    ....

    VOilà
    Merci pour tes explications très pro !

    Par contre j'ai essayé ton pattern mais le tableau qui m'est renvoyé est vide...

    Je ne vois pas pourquoi car ton expression me semble bien pensé !

  6. #6
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Grosse boulette de ma part

    J'ai oublié de mettre le modificateur s qui indique que le point représente n'importe quel caractère + les sauts de ligne. A mettre la plupart du temps quand on fonctionne en multilignes ( modificateur m )


    La liste des modificateurs

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par FCYPBA Voir le message
    Grosse boulette de ma part

    J'ai oublié de mettre le modificateur s qui indique que le point représente n'importe quel caractère + les sauts de ligne. A mettre la plupart du temps quand on fonctionne en multilignes ( modificateur m )


    La liste des modificateurs
    Bon j'ai trouvé la solution à mon problème, il fallait bien se pencher vers les expressions régulières PERL.

    Voici la synthaxe que j'ai utilisée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $pattern = '!<ACHAT[^>]+>.*?</ACHAT>!is';
     
    preg_match_all($pattern, $xml, $regs,PREG_SET_ORDER);
    En effet le rôle de "s" est hyper important !!!

    De plus cette synthaxe me permet de toucher des noeuds qui ont parfois des attributs...

    Merci de ton aide

    Et bonne journée

Discussions similaires

  1. extraire des noeuds d'un fichier xml
    Par saw-next dans le forum Général Python
    Réponses: 1
    Dernier message: 08/11/2011, 11h58
  2. extraire des noeuds d'un fichier xml
    Par saw-next dans le forum Langage
    Réponses: 1
    Dernier message: 08/11/2011, 11h29
  3. Trouver une expression régulière pour les valeurs des noeuds XML
    Par Motin dans le forum Format d'échange (XML, JSON...)
    Réponses: 11
    Dernier message: 05/10/2011, 17h51
  4. [RegExp] REGEX pour extraire des données
    Par Nicopilami dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 13/08/2010, 11h16
  5. Réponses: 2
    Dernier message: 25/06/2009, 08h23

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