Le blog de florimond

Étrangeté dans le parsing d’un fichier XML avec python

Posted on: 23 août 2006

Où l’auteur est désemparé de l’interprétation qui est faite d’une chaîne de caractères.

Soit un fichier xml bien sous tout rapport, sans DTD et écrit comme un goret, mais comme c’est un fichier de la vraie vie qu’on me donne périodiquement et où je n’ai pas le choix, il faut composer avec. Il s’agit de mon rapport pour le jeu Ténébreuse, qui contient donc des informations diverses concernant mes flottes, mes systèmes, mes détections et mes contacts. Informations que je voudrais réorganiser à l’aide d’un script python pour perdre moins de temps à préparer mes ordres.


J’utilise l’api sax de python pour chopper les informations dont j’ai besoin, et avec plus ou moins d’artifices et beaucoup d’acharnement, je peux récupérer correctement tout ce dont j’ai besoin, à l’exclusion des deux lignes NOM présentées ci-dessous :

<CONTACT> <NUMERO>96</NUMERO> <NOM>Sparta&apos;Ko</NOM> <RACE>Shindars</RACE> <EMAIL>spartako--free.fr</EMAIL> </CONTACT>
<CONTACT> <NUMERO>169</NUMERO> <NOM>Elrick&quot;le Juste&quot;</NOM> <RACE>Darkens</RACE> <EMAIL>memedou--wanadoo.fr</EMAIL> </CONTACT>

Allez savoir pourquoi, lorsque mon programme écrit un autre rapport je récupère dans le premier cas Ko et dans le second « , ce qui est clairement insuffisant. Une tentative de print pour voir le contenu de la variable content transmise par sax à la méthode characters qui me permet d’en faire ce que je veux me retourne trois lignes dans un cas, et quatre dans l’autre :

Sparta ' Ko Elrick " le Juste "

Cela m’a laissé à penser que le parseur me transmettait une ligne coupée mais malgré plusieurs tentatives d’approches à base de join, split, et autres fill du module textwrap, il s’est avéré impossible de reconstituer une seul ligne.

Suite à une remarque de _ezaK, j’ai espionné content.repr, qui s’est révélé surprenant :

<method-wrapper object at 0x00A65F30> <method-wrapper object at 0x00A65F30> <method-wrapper object at 0x00A65F30> <method-wrapper object at 0x00A65F30> <method-wrapper object at 0x00A65F30> <method-wrapper object at 0x00A65F30> <method-wrapper object at 0x00A65F30>

Bien évidemment, quand je remplace à la main &apos; par ‘ dans le fichier XML, je n’ai plus ce genre d’ennuis, mais ce contournement ne me satisfait guère. Dear lazyweb, do you have a solution? (En l’occurence, mes recherches sur sax et les chaines tronquées ne m’ont conduit que vers Java. Mais peut-être un de mes lecteur a-t-il une brillante idée. J’espère ne pas avoir achevé Pierre-Louis en m’étendant si longuement sur un billet parlant de XML.)

Publicités

5 Réponses to "Étrangeté dans le parsing d’un fichier XML avec python"

Si tu dois à tout prix faire du XML en python, ton fichier devrait contenir :

import xml.dom.minidom

Le reste, c’est de la perversion. Et sax pine des ours.

Dom et Sax ont deux objectifs différents, et donc 2 utilisations différentes. Dom permet de générer un arbre à partir du fichier XML, une représentation permanente dans laquelle l’utilisateur peut ensuite évoluer à sa guise ; SAX quant à lui ne fait que parser et c’est à l’utilisateur de gérer ses structures de données. Je vais voir ce soir si je peux te tirer de ce mauvais pas…

Verrai demain. Ai la flemme, là.

On m’a donné un choix entre dom et sax, j’ai pris sax, parce que dom m’apparait comme de l’overkill monstrueux. Là je parse mon document une fois, j’ai mes données sous le coude et j’en fais tranquillement ce que je veux sans totalement exploser le peu de RAM que j’ai. Déjà que là il faut une poignée de secondes pour parcourir la purée de plusieurs méga-octets qui contitue le rapport de base en xml… Mais ça n’est pas le problème. Effectivement, SAX pine des ours sur le problème soumit ici. Qu’est ce qui m’assure que ce serait mieux avec DOM ?

Et pour revenir sur le sujet, pas de progrès ici. Il faut dire que je n’ai pas regardé hier soir. 🙂

Et c’est donc résolu grâce à l’aide précieuse de _ezaK, qui m’a fourni un mini programme montrant du doigt la solution. En fait, entre les deux balises NOM, la méthode characters est appelée trois fois et non pas une seule fois comme je le pensais : il semblerait que sax découpe les bouts et fasse un appel qui donne content « Sparta », un qui donne « ‘ », et un qui donne « Ko », pour le premier cas par exemple. La solution est donc, entre deux balises contact, de ne pas setter directement une variable au contenu de content mais de faire plutôt une concaténation (avec une liste, ou directement sur les chaînes, comme vous préférez. Et du coup, ça marche. \o/

Merci encore de m’avoir ouvert les yeux.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

août 2006
L M M J V S D
« Juil   Sep »
 123456
78910111213
14151617181920
21222324252627
28293031  

Ce que je ne développe pas

Erreur : Twitter ne répond pas. Veuillez patienter quelques minutes avant d'actualiser cette page.

%d blogueurs aiment cette page :