Сохранение XML-файлов с помощью 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> <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> 

Ниже приведен фрагмент кода:

 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?

  • Сортировка массива 2D numpy несколькими осями
  • как убить процессы зомби, созданные модулем многопроцессорности?
  • Python, нажмите любой ключ для выхода
  • разбор файла fasta с использованием генератора (python)
  • c ++ back end вызывает уровни обратного вызова, определенные на уровне python, с помощью обертки swig
  • Файл сжатия с сохраненной измененной меткой времени
  • python.array против numpy.array
  • Вход на сайт через Python
  • 4 Solutions collect form web for “Сохранение XML-файлов с помощью ElementTree”

    Чтобы избежать префикса ns0 перед чтением данных XML необходимо установить пространство имен по умолчанию.

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

    Вам необходимо зарегистрировать все пространства имен.

    Например: если у вас есть 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"> 

    Затем вам нужно зарегистрировать все пространства имен, т.е. атрибуты, присутствующие в xmlns например:

     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") 

    Кажется, что вы должны объявить свое пространство имен, а это значит, что вам нужно изменить первую строку вашего xml:

     <ns0:trk> 

    к чему-то вроде:

     <ns0:trk xmlns:ns0="uri:"> 

    После этого вы больше не получите ParseError: for unbound prefix: ... и:

     elem.tag = elem.tag[(len('{uri:}'):] 

    удалит пространство имен.

    Этот ответ действительно помог мне избежать проблемы ns0. Я конвертирую GPX из GPaw (когда он работает) в KML (для карт Google), и мой код не работал, пока я не установил пространство имен по умолчанию, подобное этому ET.register_namespace(""," http://www.opengis.net/kml/2.2 ")

    Python - лучший язык программирования в мире.