XML et récupération de noeuds suivant un chemin

XML et récupération de noeuds suivant un chemin - PHP - Programmation

Marsh Posté le 05-05-2009 à 19:37:42    

Bonjour,

 

Je suis en train de faire une sorte de parseur perso en PHP, mais j'ai des gros problèmes de lenteurs. Voici un exemple de XML :

Code :
  1. <root>
  2.     <section id="sec1">
  3.         <url>section1.xml</url>
  4.         <titre>Titre de section</titre>
  5.         <categorie id="cat1">
  6.             <url>categorie1.xml</url>
  7.             <titre>Titre de cat1gorie</titre>
  8.             <page id="pag1>
  9.                 <url>page.xml</url>
  10.                 <titre>Titre de page</titre>
  11.             </page>
  12.         </categorie>
  13.         <categorie id="cat2">
  14.             <url>categorie2.xml</url>
  15.             <titre>Titre de cat2gorie</titre>
  16.         </categorie>
  17.     </section>
  18.     <section id="sec2">
  19.         <url>section2.xml</url>
  20.         <titre>Titre de s2ction</titre>
  21.         <categorie id="cat1">
  22.             <url>categorie1.xml</url>
  23.             <titre>Titre de cat1gorie</titre>
  24.         </categorie>
  25.         <categorie id="cat2">
  26.             <url>categorie2.xml</url>
  27.             <titre>Titre de cat2gorie</titre>
  28.         </categorie>
  29.     </section>
  30. </root>
 

et prenons par exemple le chemin sec1/cat1/pag1/, je veux obtenir un array qui ressemble à ça :

 
Code :
  1. array (
  2.   0 =>
  3.   array (
  4.     id => sec1,
  5.     url => section1.xml,
  6.     type => section,
  7.     enfant => array(
  8.         id => cat1,
  9.         url => categorie1.xml,
  10.         type => categorie,
  11.         enfant => array(
  12.             id => page1,
  13.             url => page.xml,
  14.             type => page
  15.         )
  16.     )
  17.   )
  18. )
 

J'y arrive avec simpleXML, (pas à le faire avec getElementById() de DOM), en faisant du XPath pour chaque noeud, enfin le truc pas optimisé du tout :/.
Du coup ma question est : est-ce que vous connaissez un moyen de faire ca propre et rapidement ?

 

Merci :)


Message édité par an3k le 05-05-2009 à 19:51:56
Reply

Marsh Posté le 05-05-2009 à 19:37:42   

Reply

Marsh Posté le 06-05-2009 à 14:06:55    

Pourquoi faire une structure en arbre dans des array alors qu'XML est nativement une structure en arbre ? Ton array, par ailleurs, mélange attributs et éléments.  
 
DOM est sans doute le plus adapté pour faire ce job, efficacement et proprement.

Reply

Marsh Posté le 08-05-2009 à 14:15:06    

J'avais le même souci.

 

J'ai fait une class PHP5 basée sur SimpleXML et DomDocument qui gère les conversions de noeuds XML en tableau, et recréé des fichiers XML à partir des tableaux.
Cette class a aussi un autre avantage : elle est à même de gérer les noeuds contenant des itérations de là même manière qu'il y ait une ou n itérations d'un noeud

 

pour faire simple, dans ton exemple tu as deux noeud "sections" en simpleXml tu as donc :

Code :
  1. <?php
  2. foreach( $xml->section as $section )
  3. {
  4.   // some code here...
  5. }
  6. ?>
 

Mais dans le cas ou il pourrait y en avoir n mais qu'il n'y en a qu'un tu es obligé de procéder comme ca :

Code :
  1. <?php
  2. if( !empty( $xml->section->url ) )
  3. {
  4.     // Only one section
  5. }
  6. else
  7. {
  8.      foreach( $xml->section as $section )
  9.      {
  10.        // some code here...
  11.      }
  12. }
  13. ?>


Tous se fait dans la déclaration d'un attribut enumerable="true"

 

http://darknesss.free.fr/XmlParser.class.zip

 

les méthodes qui t'intéressent sont XmlParser::getArray et XmlParser::cleanXmlArray


Message édité par the_bigboo le 08-05-2009 à 14:21:07
Reply

Marsh Posté le 08-05-2009 à 18:30:53    

@guybrush : je veux avoir un array pour pouvoir ajouter des informations dynamiques, et donc me "trimbaler" le XML dans mon processus deviendrait vite très lourd.
 
 
@the_bigboo : je vais tester ta classe, merci :)

Reply

Marsh Posté le 08-05-2009 à 22:06:58    

Tiens moi au courant si tu as des idées d'optimisations ;)
Les feedbacks ca m'intéresse !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed