Python 使用ElementTree保存XML文件

Python 使用ElementTree保存XML文件,python,elementtree,Python,Elementtree,我正在尝试开发简单的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>

我正在尝试开发简单的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>
我尝试过使用
register\u名称空间
,但没有任何积极的结果。
此版本的ElementTree 1.3是否有任何特定更改?

您似乎必须声明名称空间,这意味着您需要将xml的第一行从以下位置更改为:

<ns0:trk>

将删除命名空间。

为了避免使用
ns0
前缀,应在读取XML数据之前设置默认命名空间

ET.register_namespace('', "http://www.topografix.com/GPX/1/1")
ET.register_namespace('', "http://www.topografix.com/GPX/1/0")

在解析xml文件之前,需要注册所有名称空间

例如:如果您有这样的输入xml 而功能是元素树的根

<Capabilities xmlns="http://www.opengis.net/wmts/1.0"
    xmlns:ows="http://www.opengis.net/ows/1.1"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:gml="http://www.opengis.net/gml"
    xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd"
    version="1.0.0">

如果您尝试打印根目录,您将看到如下内容: http://www.host.domain/path/to/your/xml/namespace}位于0x0000000000558DB8的根标记>

因此,为了避免使用ns0前缀,您必须在解析XML数据之前更改默认名称空间,如下所示:

ET.register_namespace('', "http://www.host.domain/path/to/your/xml/namespace")

如果我理解你的问题,请告诉我,你希望使用
而不是
等等?正确。这不是一个真正的解决方案,但是由于您似乎加载了一个字符串,您是否尝试用一些regexp删除名称空间?在那之后,如果你没有任何东西就加载和保存,应该可以了。我会做的,其他一切都失败了。我想首先配置ElementTree不打印它。嗨,Rik。我展示的示例XML就是输出。解析良好的输入XML没有“ns0:”前缀。这只是标准的GPX代码。如果行
element=ET.XML(gpxdata)
为您提供了一个带有
ns0
的元素,那么“问题”在gpxdata中,在这种情况下,您必须选择“修复”gpxdata,或者找出标准解析器为什么这样做,并为其构建一个新的解析器。原始gpxdata没有任何
ns0
条目。不过,里克,你的暗示让我找到了解决办法。基本上,
ET.register\u名称空间(“”,GPX11)
ET.register\u名称空间(“”,GPX10)
应该在读取之前完成,即
ET.XML
。看起来不像以前。我能够读取XML文件并获取名称空间,只有在设置了register_名称空间之后。tree=ET.parse(str(udx_path))root=tree.getroot()ns={#提取根元素“udx”的名称空间:root.tag[1:root.tag.index('}')]}ET.register_名称空间(''',root.tag[1:root.tag.index('}')])这不是保留已解析和输出ElementTree字符串差异的完整方法(如果使用ElementTree.tostring)(根)).Singinsingh完成了。这个答案是完整的。
ET.register_namespace('', "http://www.topografix.com/GPX/1/1")
ET.register_namespace('', "http://www.topografix.com/GPX/1/0")
<Capabilities xmlns="http://www.opengis.net/wmts/1.0"
    xmlns:ows="http://www.opengis.net/ows/1.1"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:gml="http://www.opengis.net/gml"
    xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd"
    version="1.0.0">
ET.register_namespace('', "http://www.opengis.net/wmts/1.0")
ET.register_namespace('ows', "http://www.opengis.net/ows/1.1")
ET.register_namespace('xlink', "http://www.w3.org/1999/xlink")
ET.register_namespace('xsi', "http://www.w3.org/2001/XMLSchema-instance")
ET.register_namespace('gml', "http://www.opengis.net/gml")
ET.register_namespace('', "http://www.host.domain/path/to/your/xml/namespace")