Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/12/2008, à 22:37

arnaud_d

Python et XML ...

Bonsoir,

Cela fait plusieurs jours que je me prend la tête pour essayer de parser un fichier XML ultrasimple avec Python.
J'ai cherché sur internet, suis tombé sur xml.dom.minidom (que j'ai installé via le paquet python-xml) mais j'ai aussi essayé ElementTree.

RIEN NE MARCHE sad:S ! (ou plutôt "Je n'arrive rien à faire marcher" big_smile)

S'il y a quelqu'un qui sait comment faire, pourrait-il m'expliquer ?

Mon but est simple, voici mon fichier XML :

<?xml version="1.0" encoding="UTF-8"?>
<loc version="1.0" src="Groundspeak">
<waypoint>
	<name id="GCYDBJ"><![CDATA[Ved Mølleåen (5) by Fotografen]]></name>
	<coord lat="55.799483" lon="12.500783"/>
	<type>Geocache</type>
	<link text="Cache Details">http://www.geocaching.com/seek/cache_details.aspx?wp=GCYDBJ</link>
</waypoint></loc>

Je cherche simplement à avoir en sortie trois variables :

id="GCYDBJ"
lat="55.799483"
lon="12.500783"

mais je voudrais comprendre comment marche le XML avec Python parce que je voudrais aussi parser des fichiers XML google earth qui n'ont pas la même structure. (En particulier, ici, si je voulais récuperer Geocache entre les balises type, comment devrais-je m'y prendre ?

Mille fois merci à qui pourra m'aider !

Arnaud

Dernière modification par arnaud_d (Le 06/12/2008, à 22:45)

Hors ligne

#2 Le 06/12/2008, à 23:55

arnaud_d

Re : Python et XML ...

Je ne me l'explique pas mais à chaque fois que j'ai un problème il suffit que je poste un message sur le forum et je trouve dans l'heure qui suit.

Je suis désolé, c'est un phénomène assez inexpliqué (pourtant j'avais vraiment cherché avant).

Solution :

import xml.dom.minidom
from xml.dom.minidom import Node
 
doc = xml.dom.minidom.parse("a.loc")
longitude=doc.getElementsByTagName("coord")[0].getAttribute("lon").encode('utf-8')
latitude=doc.getElementsByTagName("coord")[0].getAttribute("lat").encode('utf-8')
ident=doc.getElementsByTagName("name")[0].getAttribute("id").encode('utf-8')
typ=doc.getElementsByTagName("type")[0].firstChild.nodeValue.encode('utf-8')

print ident
print latitude
print longitude
print typ

a.loc est le fichier xml
.encode('utf-8') est necessaire car la fonction getAttribute renvoie une chaine unicode.

Voilà, merci le forum

Arnaud

Dernière modification par arnaud_d (Le 07/12/2008, à 00:08)

Hors ligne

#3 Le 07/12/2008, à 19:09

ppmt

Re : Python et XML ...

Cool je suis moi aussi en train de recoder un de mes applications pour que le fichiers de donnees soit en XML plutot que du texte..

Ca va me servir!

Il est vrai que XML et Python c'est pas trop ca...Je dis ca en comparant avec PHP ou ca m'as pris moins de temps pour comprendre (bon j'avais un bon prof aussi!)


le dock dont vous avez toujours rêvé  Cairo-Dock
irc://irc.freenode.net/#Cairo-Dock-fr

Hors ligne

#4 Le 07/12/2008, à 20:03

arnaud_d

Re : Python et XML ...

ppmt a écrit :

Ca va me servir!

Cool, mon monologue n'aura pas servi à rien big_smile Je suis content si ça peut t'aider !
Si tu as des questions n'hésite pas à revenir, d'ailleurs voici une adresse qui m'a bien aidé :

http://www.w3schools.com/dom/dom_element.asp

Dernière modification par arnaud_d (Le 07/12/2008, à 20:05)

Hors ligne

#5 Le 07/12/2008, à 21:16

aleph

Re : Python et XML ...

> arnaud_d

> .encode('utf-8') est necessaire car la fonction getAttribute renvoie une chaine unicode.

Pas tout a fait. Il faut bien faire la différence entre le codage original de la source, du moteur de travail de la source et un éventuel trancodage pour effecuter ceraines tâches ultérieures comme par ex. l'affichage, l'impression, ...

La fonction getAttribute() a la gentillesse de revoyer un string unicode, dans le sens unicode de Python, cad avec le codage interne unicode de Python (sans plus de détails), prêt à être manipulé. Et ceci quelle que soit le codage de la source, cad le codage du fichier xml.

Dans Python 2.*, getAttribute renvoie un string de type unicode, avec Python 3.0 le string renvoyé est de type str.

Si, déjà lors de la lecture des informations, tu transcodes la source, la manipuler pas la suite devient difficile et impossible. Dans ton exemple, le codage de la source en utf-8 sert probablement à rendre la source compatible avec le codage de l'affichage.

Illustration avec ton fichier xml *volontairement* codé en utf-16 où j'ai remplacé l'information "lon" avec ce string test : 12c需 (les connaisseurs comprendront). Console interactive.

Python 2.6 (2.5 non testé - paresse - mais devrait être identique)

>>> import xml.dom.minidom as xm
>>> doc = xm.parse('b.utf-16')
>>> lon = (doc.getElementsByTagName('coord')[0]).getAttribute('lon')
>>> print type(lon), repr(lon)
<type 'unicode'> u'12a\xe9\u0153\u20ac'
>>> print lon.encode('cp1252') #codage selon de mon dispositif de sortie
12a需
>>> # idem ave b.utf-8, b.iso-8859-15
>>> doc.unlink()

Python 3.0

import xml.dom.minidom as xm
>>> ----------
doc = xm.parse('b.utf-16')
>>> ----------
lon = (doc.getElementsByTagName('coord')[0]).getAttribute('lon')
>>> ----------
print(type(lon), repr(lon))
<class 'str'> '12a需'
>>> ----------
#mais
>>> ----------
s = lon.encode('cp1252')
>>> ----------
print(type(s), repr(s))
<class 'bytes'> b'12a\xe9\x9c\x80'
>>> ----------
print(s)
b'12a\xe9\x9c\x80'
>>> ----------
print(s.decode('cp1252'))
12a需
>>> ----------
#ok
>>> ----------
doc.unlink()
>>> ----------

PS Je ne connais pas grand chose au xml, pour ne pas dire rien. Ta remarque sur le codage m'avait titillé.

#6 Le 08/12/2008, à 01:50

arnaud_d

Re : Python et XML ...

Bonsoir aleph,

Merci infiniment pour tes précisions. Même si j'ai lu trois fois ton message, je ne suis pas sûr d'en saisir tout le sens. Comme tu l'as compris je n'y connais pas grand chose à l'encodage et tu viens de me montrer la partie cachée de l'iceberg !

Il est vrai que j'avais fait ça pour l'affichage (débogage), cependant mon but à la fin est d'écrire la chaine de caractère dans un fichier en utilisant f.write. Pour l'instant ça marche parfaitement, mais qu'en serai-il sur un PC windows ? (où l'ISO est de rigueur ?)

Je me demande si ce (dé-, trans- ?)codage est necessaire. Faut que je me penche sur le problème parce qu'en plus mon GPS (il s'agit bien de traiter des fichiers contenant des positions GPS) n'aime pas trop les lettres dånøises qui composent le nom de certains de mes POIs.

Merci pour ces précisions.

Arnaud

Dernière modification par arnaud_d (Le 08/12/2008, à 01:51)

Hors ligne

#7 Le 08/12/2008, à 11:26

aleph

Re : Python et XML ...

> arnaud_d

Il te faut *absolument* comprendre et surtout *avoir conscience* de ce qu'est le codage de caractères.
Ceci acquis, tout le reste découlera automatiquement et logiquement (*).

Les codages de caractères et les plateformes (y compris les variantes d'une même famille) sont deux choses distinctes.

---

(*) Le coeur de ton commentaire a trois paragraphes. Quand tu auras "réglé" le premier [Merci infiniment ...], tu verras que les deux suivants n'ont pas beaucoup de sens.