J'essaie de développer un code Python (3.2) simple pour lire des fichiers XML, effectuer quelques opérations de lecture et d'écriture. corrections et les remettre en mémoire. Cependant, au cours de l'étape de stockage, ElementTree ajoute cette nomenclature d'espace de noms. Par exemple :
<ns0:trk>
<ns0:name>ACTIVE LOG</ns0:name>
<ns0:trkseg>
<ns0:trkpt lat="38.5" lon="-120.2">
<ns0:ele>6.385864</ns0:ele>
<ns0:time>2011-12-10T17:46:30Z</ns0:time>
</ns0:trkpt>
<ns0:trkpt lat="40.7" lon="-120.95">
<ns0:ele>5.905273</ns0:ele>
<ns0:time>2011-12-10T17:46:51Z</ns0:time>
</ns0:trkpt>
<ns0:trkpt lat="43.252" lon="-126.453">
<ns0:ele>7.347168</ns0:ele>
<ns0:time>2011-12-10T17:52:28Z</ns0:time>
</ns0:trkpt>
</ns0:trkseg>
</ns0:trk>
L'extrait de code est ci-dessous :
def parse_gpx_data(gpxdata, tzname=None, npoints=None, filter_window=None,
output_file_name=None):
ET = load_xml_library();
def find_trksegs_or_route(etree, ns):
trksegs=etree.findall('.//'+ns+'trkseg')
if trksegs:
return trksegs, "trkpt"
else: # try to display route if track is missing
rte=etree.findall('.//'+ns+'rte')
return rte, "rtept"
# try GPX10 namespace first
try:
element = ET.XML(gpxdata)
except ET.ParseError as v:
row, column = v.position
print ("error on row %d, column %d:%d" % row, column, v)
print ("%s" % ET.tostring(element))
trksegs,pttag=find_trksegs_or_route(element, GPX10)
NS=GPX10
if not trksegs: # try GPX11 namespace otherwise
trksegs,pttag=find_trksegs_or_route(element, GPX11)
NS=GPX11
if not trksegs: # try without any namespace
trksegs,pttag=find_trksegs_or_route(element, "")
NS=""
# Store the results if requested
if output_file_name:
ET.register_namespace('', GPX11)
ET.register_namespace('', GPX10)
ET.ElementTree(element).write(output_file_name, xml_declaration=True)
return;
J'ai essayé d'utiliser le register_namespace
mais sans résultat positif. Y a-t-il des changements spécifiques pour cette version d'ElementTree 1.3 ?
1 votes
Dites-moi si j'ai bien compris votre question, vous aimeriez avoir
<trk>
au lieu de<ns0:trk>
et ainsi de suite ?1 votes
Correct. J'aimerais avoir <trk> au lieu de <ns0:trk> et ainsi de suite.
0 votes
Ce n'est pas une vraie solution, mais comme il semble que vous chargez une chaîne de caractères, avez-vous essayé de supprimer l'espace de nom avec un regexp ? Après cela, si vous chargez et sauvegardez sans tout, tout devrait être correct.
1 votes
Salut Rik. Je vais le faire si tout le reste échoue. J'aimerais configurer ElementTree pour qu'il ne l'imprime pas en premier lieu.