Page 1 sur 1

XML - Classer dans l'ordre

Posté : 20 févr. 2013, 11:23
par J.F.bavl
Bonjour à toutes et à tous,

Dans le cadre de mon travail, je dois extraire les données d'un fichier xml très complexe et volumineux. J'ai commencé à parser à l'aide de simplexml, avec notamment des xpath un peu partout pour aller récupérer les données. Mais j'ai bien compris qu'il ne s'agit pas de la meilleur solution, étant donné que dans mon fichier xml, j'ai exactement 60273 balise <e> à extraire...sans parler des autres balises...bon.


Voici une version extrêmement simplifiée du xml, cela m'aidera certainement à comprendre le processus qu'il faut utiliser.

Quel est selon vous, le meilleur moyen d'extraire les balises <e>, dans l'ordre suivant (et ce sans utiliser de xpath...le fichier étant beaucoup trop long...) :

100
200

300
400

500
600

Code : Tout sélectionner

<mal> <ma> <e>100</e> <e>200</e> </ma> </mal> <mal> <ma> <e>300</e> <e>400</e> </ma> </mal> <mal> <ma> <e>500</e> <e>600</e> </ma> </mal>
Cette question peut paraître évidente au yeux de certains, j'ai fait les recherches nécessaire, mais la je bloque.
Si vous pouviez m'éclairer un peu, j'en serai vraiment très reconnaissant. Merci.

J.F.

Re: XML - Classer dans l'ordre

Posté : 20 févr. 2013, 11:41
par dix2
avec la méthode sax, c'est une analyse "au fil de l'eau"

@+
dix2

Re: XML - Classer dans l'ordre

Posté : 21 févr. 2013, 01:20
par damien_55
avec simplexml_load_file
foreach ($xml ->mal as $value) {
$e=$value->ma->e;
echo $e.'<br>';
}
grosso modo, je ne sais pas la structure de ton xml. Mais le principe est de boucler sur la valeur ->e

Tu peux imbriquer les foreah les uns dans les autres.

Re: XML - Classer dans l'ordre

Posté : 21 févr. 2013, 15:08
par J.F.bavl
Merci à vous pour les réponses.

Il est vrai que la méthode sax est intéressante, bien qu'un peu complexe pour mon niveau. J'aimerai être bien sûr qu'il n'y a pas d'autre moyen d'y arriver plus simplement...car

J'ai réalisé, en me relisant, que mon problème peut difficilement être compris avec mon exemple de xml simplifié (mes excuses...)

Admettons:

Code : Tout sélectionner

<mal> <ma> <na>info</na> <ke> <k> <e>100</e> <e>200</e> </k> </ke> </ma> </mal> <mal> <ma> <na>info2</na> <ke> <k> <e>200</e> <e>300</e> </k> </ke> </ma> </mal>
Voila,

ce que j'aimerai :

Info
100
200

Info2
200
300

Ce que j'ai:

Info
Info2

100
200
300
400

J'imagine que c'est tout à fait réalisable avec sax, vu qu'il parcours le fichier dans le courant de l'eau...mais est-il possible de faire cela en simplexml?

En espérant avoir été assez clair.

Un grand merci d'avance.

J.

Re: XML - Classer dans l'ordre

Posté : 21 févr. 2013, 17:04
par damien_55
avec simplexml_load_file
foreach ($xml ->mal as $value) {
$e=$value->ma->e;
echo $e.'<br>';
}
grosso modo, je ne sais pas la structure de ton xml. Mais le principe est de boucler sur la valeur ->e

Tu peux imbriquer les foreah les uns dans les autres.
Admettons

Code : Tout sélectionner

<?xml version="1.0"?> <channel> <mal> <ma> <na>info</na> <ke> <k> <e>100</e> <e>200</e> </k> </ke> </ma> </mal> <mal> <ma> <na>info2</na> <ke> <k> <e>200</e> <e>300</e> </k> </ke> </ma> </mal> </channel>
<?php

$xml = simplexml_load_file('info.xml');

foreach ($xml ->mal as $value) {
$info= $value->ma->na;
echo '<br>';
echo $info.'<br>';

foreach ($value ->ma->ke->k->e as $valeur) {
$e= $valeur;
echo $e.'<br>';
}
}
?>
Résultat

info
100
200

info2
200
300

Re: XML - Classer dans l'ordre

Posté : 21 févr. 2013, 17:18
par Invité
La grande classe, Merci Damien!

A plus

Re: XML - Classer dans l'ordre

Posté : 21 févr. 2013, 17:37
par damien_55
De rien :D

Re: XML - Classer dans l'ordre

Posté : 22 févr. 2013, 12:31
par J.F.bavl
Salut, je reviens.

Est-il possible de récupérer seulement la deuxième balise <e> de chaque <k> ?


Image


Cela fonctionne avec les <k>, si j'entre le code comme cela:
foreach ($value ->ke->k[0]->e as $audio) {
$e= $audio;
echo $e.'<br/>';
}
foreach ($value ->ke->k[1]->e as $cote) {
$e1= $cote;
echo $e1.'<br/>';
}
Mais pas avec la dernière balise comme cela:
foreach ($value ->ke->k[0]->e[2] as $audio) {
$e= $audio;
echo $e.'<br/>';
}
foreach ($value ->ke->k[1]->e[2] as $cote) {
$e1= $cote;
echo $e1.'<br/>';
}
ps. ca vaut aussi si je met ->e[1], ou e[2] ou e[37], j'ai tout essayé...

Salutations,

J.

Re: XML - Classer dans l'ordre

Posté : 22 févr. 2013, 13:05
par damien_55
Comme hier :D

Admettons

Code : Tout sélectionner

<?xml version="1.0"?> <channel> <mal> <ma> <na>info</na> <ke> <k> <e>Audio</e> <e>francais</e> </k> </ke> </ma> </mal> <mal> <ma> <na>info2</na> <ke> <k> <e>cote archive</e> <e>K11129</e> </k> </ke> </ma> </mal> </channel>
<?php

$xml = simplexml_load_file('info.xml');

foreach ($xml ->mal as $value) {
$info= $value->ma->na;


foreach ($value ->ma->ke->k as $valeur) {
$e= $valeur->e[1];
echo $e.'<br>';
}
}
?>
Résultat

francais
K11129

Re: XML - Classer dans l'ordre

Posté : 22 févr. 2013, 13:37
par J.F.bavl
Je déborde de gratitude...

Merci.

A bientôt,

J.