Pear::XML_Parser, récupérer le contenu texte d'une balise

Pear::XML_Parser, récupérer le contenu texte d'une balise - PHP - Programmation

Marsh Posté le 10-04-2005 à 18:39:32    

Bonjour !!!!
 
Je me suis mis en tête d'utiliser le parser xml de la librairie Pear, nommé XML_Parser.
 
Tant que je ne récupérais que les attributs, tout allait bien, mais maintenant que je veux récupérer le contenu textuel d'une balise, je n'y arrive pas...
J'utilise le parser en mode 'func', c'est à dire que je déclare pour chaque balise à parser une fonction xmltag_[MABALISE]. Ces fonctions contiennent la ressource (l'occurence de classe ? le fichier xml ?), le nom du tag ainsi que les attributs... ce que je recherche, c'est le contenu... est-ce que quelqu'un saurai m'expliquer comment faire ??
 
D'avance merci pour une éventuelle piste ou réponse ;)
 
 
a++

Reply

Marsh Posté le 10-04-2005 à 18:39:32   

Reply

Marsh Posté le 11-04-2005 à 09:08:12    

Bah je sais pas si j'ai bien compris ta question si c'est le cas alors je dirais un p'tit de preg_replace devrait convenir à ta situation avec la bonne expression régulière.
cf: http://www.php.net/

Reply

Marsh Posté le 11-04-2005 à 10:53:39    

Hello!!
 
Nan, en fait, pas grand chose à voir, les regex...
Le truc, c'est que le XML_Parser de la lib PEAR est décliné en 2 versions : XML_Parser, et XML_Parser_Simple, qui est une version light et qui permet de récupérer les contenus, contrairement à XML_Parser.
 
Donc la réponse se trouvait dans l'utilisation de XML_Parser_Simple.
 
 
Merci tout de même ;)

Reply

Marsh Posté le 11-04-2005 à 11:57:00    

titouille a écrit :

Hello!!
 
Nan, en fait, pas grand chose à voir, les regex...
Le truc, c'est que le XML_Parser de la lib PEAR est décliné en 2 versions : XML_Parser, et XML_Parser_Simple, qui est une version light et qui permet de récupérer les contenus, contrairement à XML_Parser.
 
Donc la réponse se trouvait dans l'utilisation de XML_Parser_Simple.
 
 
Merci tout de même ;)


 
Pourtant la remarque précédente était tout à fait justifiée. Je trouve très lourd l'utilisation des xmlparsers pour récupérer le contenu entre des balises. Dans bien des cas, une simple regexp suffit (et est bien plus rapide en plus...)

Reply

Marsh Posté le 11-04-2005 à 13:59:17    

Hello hermes
 
J'ai déjà entendu ça ailleurs, mais utiliser des regex pour parser du xml n'est pas recommandé, car une regex ne va en aucun vérifier la validité de ton document xml. Tu n'auras pas accès à toute la panoplie de méthodes internes et utilisateurs pour manipuler du xml.
 
Par contre, il est vrai que dans mon cas, l'utilisation de regex aurait pu être envisageable, mais je ne le ferai pas, pour la simple et bonne raison qu'un parser sax est plus rapide... J'ai un document de 18mo à parser. (Si je ne me trompe pas, un parser Sax lit environ 2mo à la seconde)
Le problème, dans ce document, c'est que certaines balises sont nommées avec des '-', du genre hello-world.
J'ai mis en place 2 ereg_replace (ou preg_replace, je ne suis plus trop sur, chuis vraiment pas spécialiste dans les regex...) dans mon script pour qu'il transforme les 2 balises mal nommées en supprimant le tiret avant d'exécuter le vrai parsing, mais je peux te dire qu'a partir de là, ce n'était plus 6 à 10 secondes d'attente (parsing sax uniquement) mais plutot 30 ou 40...  
Donc non, je ne pense pas que les regex sont vraiment plus rapide qu'un parser sax bien implémenté. Et de plus, je n'ai pas que les contenus à récupérer. j'ai également les attributs. Donc résolument PEAR:XML_Parser_Simple :p ;)

Reply

Marsh Posté le 11-04-2005 à 14:03:25    

Normalement, en regardant la doc du parser de pear, tu peux voir que c'est géré par évènement. Donc tu dois te retrouver parfois avec des nodes de type text...

Reply

Marsh Posté le 11-04-2005 à 14:16:52    

Ok FlorentG, mais comment je déclare une fonction qui va récupérer le contenu (on parle de parser Sax en mode 'func', donc déclaration d'une fonction pour une balise... exemple : balise <title> = function xmltag_TITLE( $ressource, $nodename, $attributes ) Ici je n'ai pas la possibilité de récupérer le contenu. Donc si je dois déclarer une fonction du genre xmltag_CDATA, ça va devenir bien galère à gérer quel contenu appartient à quel node (à coup de switch, me diras-tu, oui mais c'est lourd, tout de même...)
 
Dans ce mode, je ne crois pas que c'est possible de récupérer le contenu textuel... Enfin, je n'ai pas trouvé de solutions avec XML_Parser, mais XML_Parser_Simple implémente des méthodes du genre handleElement_TITLE( $nodename, $attributes, $data ) ou $data correspond au contenu textuel. Donc c'est tout bon.
 
 :hello:

Reply

Marsh Posté le 11-04-2005 à 14:18:22    

Mystère :D Moi j'utilise les fonctions DOM XML de PHP 4 :/

Reply

Marsh Posté le 11-04-2005 à 14:43:53    

Ok. Alors juste pour info :  
 
Il faut savoir que Dom et Sax sont 2 parsers fondamentalement différents... utiliser dom pour un document de 18 mo à parser en entier est une folie pure.  
 
Dom met en mémoire tout ou un fragment du document pour pouvoir y naviguer à la manière d'un treeview. Il garde en mémoire le document et donne accès à des méthodes particulières genre getChildNodes, getNodeAt, etc... relativement lourd, mais pratique pour la navigation à l'intérieur du document.
Sax quant à lui fait une lecture linéaire du document, du début à la fin. Pas moyen de revenir en arrière. Et là, tu peux créer à peu près n'importe quel parsing, vu que c'est toi qui décide comment tu l'implémente. Après, on peut arriver à de véritables usines à gaz, lol.
 
Et c'est cette grande différence qui permet à Sax d'être si rapide. Chacun de ces parsers ont des utilisations bien précises, c'est pour ça que je parlais de folie pure en début de post ;) Dom ne serait pas du tout adapté à l'utilisation que je fais d'xml (parsing pour transformer un doc xml en objet "dataProvider" pour Flash remoting. Et il serai surtout beaucoup, mais alors beaucoup trop long à me donner un retour...
 
a++

Reply

Marsh Posté le 11-04-2005 à 14:57:37    

Ok, c'est sûr que si le fichier est énorme, c'est pas judicieux de l'ouvrir avec DOM :D

Reply

Sujets relatifs:

Leave a Replay

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