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] recherche balises - extraire données


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 17
    Points
    17
    Par défaut [SimpleXML] recherche balises - extraire données
    Bonjour a tous,

    je souhaite récupérer les données de fichiers xml, la partie qui m'intéresse est comprise entre <entry id=" "> et </entry>

    la balise qui suit est soit <article> soit <incollection>

    puis les champs sont presque toujours les mêmes a 95%

    exemple de fichier xml :
    Code XML : 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
      <?xml version="1.0" encoding="UTF-8" ?> 
    - <file xmlns="http://bibtexml.sf.net/">
    - <metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
      <dc:date>2008-01-16T14:46:59+0100</dc:date> 
      <dc:format>text/xml</dc:format> 
      <dc:identifier>urn:uuid:430da0cf-98d7-41af-b0ec-0d6595484b68</dc:identifier> 
      </metadata>
    - <entry id="MR2255532">
    - <article>
      <author>Perron, Bernard</author> 
      <title>A homotopic intersection theory on surfaces: applications to mapping class group and braids</title> 
      <journal>Enseign. Math. (2)</journal> 
      <fjournal>L'Enseignement Mathématique. Revue Internationale. IIe Série</fjournal> 
      <volume>52</volume> 
      <year>2006</year> 
      <number>1-2</number> 
      <pages>159-186</pages> 
      <issn>0013-8584</issn> 
      <coden>ENMAAR</coden> 
      <mrclass>57M50 (20F65 57M05 57M25)</mrclass> 
      <mrnumber>MR2255532 (2008a:57020)</mrnumber> 
      <mrreviewer>Andrew Putman</mrreviewer> 
      </article>
      </entry>
      </file>

    Je souhaite donc tester si la balise article existe ou non si oui je récupère les informations qu'elle contient...

    Voici mon code

    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
    <?php
    $xml = simplexml_load_file('livres.xml');
     
    foreach ($xml->entry as $entry)
    {
     
    	print "\nID {$entry['id']} <br />\n";
     
    	//balise rechercher
    	$rech_article = "//article";
     
    	//stockage du resultat
    	$res_rech_article = $xml->xpath($rech_article);
     
    	//affichage
    	echo $res_rech_article[0];
     
    	if ($res_rech_article == "article")
    	{
    		foreach ($entry->article as $article)
    		{
    			$auteur = $article->author;
    			$titre = $article->titre;
    			//...
    		}
            }
    }
    ?>
    Hors $res_rech_article[0] ne contient rien pourtant je recherche sur le fichier xml donné en exemple.

    J'aimerai savoir si je procède de la bonne façon, si oui comment résoudre mon problème, si non comment faire.

    Merci d'avance.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par dftrish
    je souhaite récupérer les données de fichiers xml, la partie qui m'intéresse est comprise entre <entry id=" "> et </entry>
    Par une expression XPath (attention aux espaces de noms) ou via la méthode children() appliquée à l'objet SimpleXMLElement correspondant à cet élément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $sxml = simplexml_load_file(...);
     
    /* /!\ L'élément entry est supposé existant */
    foreach ($sxml->entry->children() as $n) {
        // ...
    }
    Citation Envoyé par dftrish
    la balise qui suit est soit <article> soit <incollection>
    Avec la fonction isset :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /* /!\ L'élément entry est supposé existant */
    if (isset($sxml->entry->article)) {
        echo 'Element article';
    } else if (isset($sxml->entry->incollection)) {
        echo 'Elément incollection';
    } else {
        echo "Pas d'éléments article ou incollection";
    }
    Citation Envoyé par dftrish
    Hors $res_rech_article[0] ne contient rien pourtant je recherche sur le fichier xml donné en exemple.
    Comme indiqué plus haut, l'espace de nom n'est pas pris en compte donc le résultat est normal.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 17
    Points
    17
    Par défaut
    Merci pour ta rapidité.

    Je vais essayer de comprendre et utiliser tout ca.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 17
    Points
    17
    Par défaut
    J'ai essayé de suivre tes conseille voila en gros mon code

    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
    <?php
     
    $xml = simplexml_load_file('livres.xml');
     
    foreach ($xml->entry->children() as $entry_xml)
    {
    	if (isset($xml->entry->article))
    	{	
    		if (isset($entry_xml->author))
    		{
    			echo $entry_xml->author."<br><br>";
    		}
     
                     .....
     
    		if (isset($entry_xml->mrreviewer))
    		{
    			echo $entry_xml->mrreviewer."<br><br>";
    		}
    	}
    	elseif (isset($xml->entry->incollection))
    	{
             .....
    J'obtien bien se que je voulais j'espere que ma méthode est correct.

    Je n'ai plus cas remplacer les echo de teste pas des variables.

    Derniere question :

    IIe Série (dans le xml) à donné IIe Série (dans l'affichage php)

    Je crois avoir vue des topic parlant d'utf-8 (or mon xml est bien en utf-8)

    <?xml version="1.0" encoding="UTF-8" ?>

    Que faire ?

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Ça dépend de chaque encodage utilisé dont celle de la sortie HTML générée par votre script, qui est vraisemblablement de type latin1 donc il faudrait utiliser la fonction utf8_decode, par exemple, préalablement sur les données provenant du document XML que vous affichez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo utf8_decode($entry_xml->author)."<br><br>";
    Et ainsi de suite.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 17
    Points
    17
    Par défaut
    Parfait ca marche.

    Derniere question :

    dans le cas ou le fichier xml contiendrait deux entry

    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
    18
    19
    20
    21
    - <entry id="calbrix.alleche">
    - <article>
      <author>Alleche, B.</author> 
      <author>Calbrix, J.</author> 
      <journal>Topology Appl.</journal> 
      <pages>207-218</pages> 
      <title>On the coincidence of the upper Kuratowski topology with the cocompact topology</title> 
      <volume>{\bf 93}</volume> 
      <year>1999</year> 
      </article>
      </entry>
    - <entry id="aniskovic">
    - <article>
      <author>v c, E. M. Aniskovi\</author> 
      <journal>Soviet Math. Dokl.</journal> 
      <pages>202-205</pages> 
      <title>On subspaces of sequential spaces</title> 
      <volume>{\bf 28}</volume> 
      <year>1981</year> 
      </article>
      </entry>
    est-il possible de recuperé les info de la premiere entré (puis les stoker dans la bdd) puis passé a l'entry suivante... ?

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Vous faites une itération en ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($sxml->entry as $e) {
        echo $e['id'];
    }
    Ça fonctionnera ainsi qu'il y en ait un ou plus.

    Vous pouvez aussi utiliser les propriétés de SimpleXML :

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 17
    Points
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    - <bibtex:file xmlns:bibtex="http://bibtexml.sf.net/">
    - <bibtex:entry id="MR2356985">
    - <bibtex:article>
      <bibtex:author>Akhmediev, Nail and Soto-Crespo, J. M. and Grelu, Philippe</bibtex:author> 
      <bibtex:title>Spatiotemporal optical solitons in nonlinear dissipative media: from stationary light bullets to pulsating complexes</bibtex:title> 
    .........
      </bibtex:article>
      </bibtex:entry>
      </bibtex:file>
    Que faire si les balises continent des : ?

    foreach ($xml->bibtex:entry->children as $entry_xml)

    je pense qu'il interprete ca comme quand on fait de l'objet en php...

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Le plus simple c'est de passer par une expression XPath :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($sxml->xpath('//bibtex:entry') as $e) {
        echo $e['id'];
    }
    Puisque l'extension SimpleXML gère assez difficilement les namespaces

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par julp Voir le message
    Le plus simple c'est de passer par une expression XPath :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($sxml->xpath('//bibtex:entry') as $e) {
        echo $e['id'];
    }
    Puisque l'extension SimpleXML gère assez difficilement les namespaces
    Merci encore, j'ai reussi a traité mes fichier xml.

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

Discussions similaires

  1. [XL-2003] Extraire données des fichiers Excel d'un répertoire avec recherche dans chacun
    Par LeNoobee dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 03/12/2014, 20h51
  2. rechercher et extraire deux chaines dans un fichier
    Par piotr dans le forum Langage
    Réponses: 16
    Dernier message: 13/07/2006, 16h07
  3. [SQL] Moteur de recherche problème affichage donnée dans select
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 07/04/2006, 21h27
  4. Extraire données fichier txt
    Par philippef dans le forum Langage
    Réponses: 1
    Dernier message: 10/10/2005, 18h12
  5. [Telechargement de Fichier] Recherche balise adéquate
    Par Kylen dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 12/09/2005, 16h21

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