XD blog

blog page

parser


2013-02-16 Parser du XML

Traiter du XML peut s'avérer un cauchemar parfois. D'abord pour des problèmes d'encodings, je suis toujours ébahi devant la résistance que ces problèmes m'opposent. Je suis tout simplement incapable de comprendre dans quel sens opérer mes conversions, encoder, décoder, j'essaye tout et souvent sans succès comme cela est généralement le cas lorsqu'on essaye de réparer une erreur à l'aveugle. Bref, mon problème du jour revenait à ajouter un champ à une palanquée de fichiers HTML. J'ai donc choisi de coder le "truc".

J'ai choisi de parser le fichier en XML plutôt qu'en HTML parce qu'il est plus facile ensuite d'accéder aux noeuds du documents. J'ajoute mon noeud et je sauve le document. Manque de bol, tous les guillements de mon code javascript ont disparu et été remplacé par un code abominable. Je vais sur le net, je trouve que le module xml.dom.minidom que j'utilise ne permet pas de conserver les accents. J'adore. Je finis par écrire un code vraiment sale :


more...

2013-02-02 Parser du XML

Parser du XML est toujours laborieux pour moi parce que je ne retiens jamais les librairies qu'il faut utiliser, le modèle SAX ou DOM. J'avais besoin de lire les fichiers issus du site Wikipedia qui sont organisés comme suit :

<root>
    <page>
        contenu d'une page
    </page>
    <page>
        contenu d'une autre page
    </page/>
...
</root>
Le fichier de Wikipedia fait malhreusement plusieurs gigaoctets, il est juste impossible de tout charger en mémoire (sur la plupart des ordinateurs) sauf si on dispose d'au moins 20Go de mémoire et qu'on ne veut pas s'occuper de Wikipedia en langue anglaise. En procédant de la sorte, on est obligé de découper les fichiers.

Le programme suivant permet d'explorer les premiers objets d'un fichier Wikipedia ou de n'importe quel fichier XML pour peu qu'il contienne une collection d'objets.

from hal_xml_tree import *

file = r"c:\temp\ptwiki-20130125-pages-articles.xml"
f = open (file, "r")

parser  = XMLIterParser ()
handler = XMLHandlerDict ()
parser.setContentHandler (handler)
nb = 0
for o in parser.parse(f) :
    for a,b in o.iterfields() :
        if len(b) > 0 :print [a,b]
    print "---------------------"
    nb += 1
    if nb > 10: break

more...

Xavier Dupré