Comment parser un fichier XML multi-noeuds avec XMLReader ?
Posté : 11 avr. 2016, 11:34
Bonjour à tous,
Je lis souvent le forum pour trouver des réponses, mais je n'y ai jamais participé. Car cette fois-ci, je n'ai pas trouvé de réponse à ma question.
Celle-ci concerne l'utilisation de XMLReader pour parser un fichier XML. Il y a peu d'aide et de ressources disponibles en ligne j'ai l'impression.
Je dois parser un fichier XML assez lourd (environ 200 mo). Impossible de le faire avec SimpleXML (cela consomme trop de mémoire). En cherchant, j'ai trouvé que dans mon cas il me fallait plutôt utiliser la librairie XMLReader.
C'est vrai que cela fonctionne bien et c'est plutôt rapide, même avec un gros fichier.
Sauf que le fichier XML que je dois parser est plutôt mal foutu.
En voici une représentation simplifiée :
Lorsque j'éxécute ce code, je ne récupère que les produits du premier noeud "fournisseur" (produits de 1 à 4 dans mon exemple) :
(à savoir que je ne peux pas charger dans un tableau tout un noeud "fournisseur", ce serait beaucoup trop lourd en mémoire).
Je pense que la solution est toute bête, mais je bute dessus depuis plusieurs jours et j'ai besoin de vos lumières pour m'éclairer !
Merci par avance aux âmes charitables qui pourront me donner un coup de main !!
Je lis souvent le forum pour trouver des réponses, mais je n'y ai jamais participé. Car cette fois-ci, je n'ai pas trouvé de réponse à ma question.
Celle-ci concerne l'utilisation de XMLReader pour parser un fichier XML. Il y a peu d'aide et de ressources disponibles en ligne j'ai l'impression.
Je dois parser un fichier XML assez lourd (environ 200 mo). Impossible de le faire avec SimpleXML (cela consomme trop de mémoire). En cherchant, j'ai trouvé que dans mon cas il me fallait plutôt utiliser la librairie XMLReader.
C'est vrai que cela fonctionne bien et c'est plutôt rapide, même avec un gros fichier.
Sauf que le fichier XML que je dois parser est plutôt mal foutu.
En voici une représentation simplifiée :
<catalog>
<fournisseur>
<produit>
<nom_produit>Produit 1</nom_produit>
</produit>
<produit>
<nom_produit>Produit 2</nom_produit>
</produit>
<produit>
<nom_produit>Produit 3</nom_produit>
</produit>
<produit>
<nom_produit>Produit 4</nom_produit>
</produit>
</fournisseur>
<fournisseur>
<produit>
<nom_produit>Produit 5</nom_produit>
</produit>
<produit>
<nom_produit>Produit 6</nom_produit>
</produit>
<produit>
<nom_produit>Produit 7</nom_produit>
</produit>
<produit>
<nom_produit>Produit 8</nom_produit>
</produit>
</fournisseur>
</catalog>
Mon but est de parser tous les noeuds "produit". Cependant, ces noeuds sont dans plusieurs noeuds "fournisseur".Lorsque j'éxécute ce code, je ne récupère que les produits du premier noeud "fournisseur" (produits de 1 à 4 dans mon exemple) :
$z = new XMLReader;
$z->open($file);
$doc = new DOMDocument;
while ($z->read() && $z->name !== 'produit');
while ($z->name === 'produit')
{
$node = simplexml_import_dom($doc->importNode($z2->expand(), true));
echo $node->nom_produit; // juste pour tester ce que je récupère
var_dump($node->element_1);
$z2->next('produit');
}
Comment faire pour parser tous les produits, indépendamment des noeuds "fournisseur" (donc dans mon exemple plus haut, récupérer les produits 1 à 8) ?(à savoir que je ne peux pas charger dans un tableau tout un noeud "fournisseur", ce serait beaucoup trop lourd en mémoire).
Je pense que la solution est toute bête, mais je bute dessus depuis plusieurs jours et j'ai besoin de vos lumières pour m'éclairer !
Merci par avance aux âmes charitables qui pourront me donner un coup de main !!