Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > SimpleXML
SimpleXML Forum d'entraide pour l'extension SimpleXML, qui permet de manipuler des documents XML en PHP (approche DOM).
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/01/2008, 16h26   #1
Invité régulier
 
Inscription : mai 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 27
Points : 5
Points : 5
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 :
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 :
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.
dftrish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 18h26   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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 :
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 :
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.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 19h03   #3
Invité régulier
 
Inscription : mai 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 27
Points : 5
Points : 5
Merci pour ta rapidité.

Je vais essayer de comprendre et utiliser tout ca.
dftrish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 22h15   #4
Invité régulier
 
Inscription : mai 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 27
Points : 5
Points : 5
J'ai essayé de suivre tes conseille voila en gros mon code

Code :
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 ?
dftrish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 22h54   #5
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Ç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 :
echo utf8_decode($entry_xml->author)."<br><br>";
Et ainsi de suite.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2008, 09h44   #6
Invité régulier
 
Inscription : mai 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 27
Points : 5
Points : 5
Parfait ca marche.

Derniere question :

dans le cas ou le fichier xml contiendrait deux entry

exemple :

Code :
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... ?
dftrish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2008, 10h39   #7
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Vous faites une itération en ce cas :
Code :
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 :
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2008, 11h42   #8
Invité régulier
 
Inscription : mai 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 27
Points : 5
Points : 5
Code :
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...
dftrish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2008, 12h01   #9
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Le plus simple c'est de passer par une expression XPath :
Code :
1
2
3
foreach ($sxml->xpath('//bibtex:entry') as $e) {
    echo $e['id'];
}
Puisque l'extension SimpleXML gère assez difficilement les namespaces
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2008, 11h52   #10
Invité régulier
 
Inscription : mai 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 27
Points : 5
Points : 5
Citation:
Envoyé par julp Voir le message
Le plus simple c'est de passer par une expression XPath :
Code :
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.
dftrish est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h24.


 
 
 
 
Partenaires

Hébergement Web