lxml.etree и xml.etree.ElementTree добавляют пространства имен без префиксов (ns0, ns1 и т. д.)

Есть ли какое-либо решение для добавления пространств имен без префикса (я имею в виду эти ns0, ns1), которые работают со всеми реализациями etree, или есть рабочие решения для каждого из них?

На данный момент у меня есть решения для:

  • lxml — аргумент элемента nsmap
  • (c)ElementTree(python 2.6+) — зарегистрировать метод пространства имен с пустой строкой в ​​качестве префикса

Проблема (c) ElementTree в python 2.5, я знаю, что есть атрибут _namespace_map, но установка его в пустую строку создает недопустимый XML, установка его в None добавляет пространства имен по умолчанию ns0 и т. д., есть ли какое-либо рабочее решение?

наверное

Element('foo', {'xmlns': 'http://my_namespace_url.org/my_ns'})

это плохая идея?

Спасибо за помощь


person virhilo    schedule 13.12.2010    source источник


Ответы (3)


Я просто работаю для вас.

Определите свой собственный префикс:

unique = 'bflmpsvz'

my_namespaces = {
                 'http://www.topografix.com/GPX/1/0' :    unique,
                 'http://www.groundspeak.com/cache/1/0' : 'groundspeak',
                }
xml.etree.ElementTree._namespace_map.update( my_namespaces )

А затем замените/удалите префикс на выходе:

def writeDown(data, output_filename):

    data.write(output_filename)
    txt = file(output_filename).read()
    txt = txt.replace(unique+':','')
    file(output_filename,'w').write(txt)

Возможно, есть лучшее решение.

person Jiří Polcar    schedule 13.12.2010

Я воспользовался идеей Иржи, но добавил дополнительную строку на тот случай, если уникальное также является пространством имен по умолчанию:

def writeDown(data, output_filename):

    data.write(output_filename)
    txt = file(output_filename).read()
    txt = txt.replace(unique+':','')
    txt = txt.replace('xmlns:'+unique,'xmlns')
    file(output_filename,'w').write(txt)
person user411279    schedule 01.02.2012

Я использую Python 3.3.1, и у меня работает следующее:

xml.etree.ElementTree.register_namespace('', 'http://your/uri')
data.write(output_filename)

Преимущество заключается в том, что вам не нужно обращаться к частному xml.etree.ElementTree._namespace_map, как предложил Jiri.

Я вижу, что то же самое доступно и в Python 2.7.4.

person sferencik    schedule 24.07.2013
comment
Это не работает с lxml, который использует OP, не так ли? - person Thomas W; 04.12.2016
comment
Извините, без понятия; Прошло много времени! - person sferencik; 05.12.2016