【发布时间】:2012-02-17 11:25:17
【问题描述】:
我正在尝试开发简单的 Python (3.2) 代码来读取 XML 文件,进行一些 更正 并将它们存储回来。但是,在存储步骤中,ElementTree 添加了这个命名空间命名法。例如:
<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>
代码sn-p如下:
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;
我尝试过使用register_namespace,但没有得到肯定的结果。
此版本的 ElementTree 1.3 是否有任何特定更改?
【问题讨论】:
-
如果我理解你的问题,请告诉我,你想要
<trk>而不是<ns0:trk>等等? -
正确。我想要
而不是 等等。 -
这不是一个真正的解决方案,但由于您似乎加载了一个字符串,您是否尝试使用一些正则表达式删除命名空间?之后,如果您在没有任何内容的情况下加载和保存应该没问题。
-
嗨瑞克。我会做其他一切都失败了。我想首先将 ElementTree 配置为不打印它。
标签: python elementtree