lxml.etree и xml.etree.ElementTree добавление пространств имен без префиксов (ns0, ns1 и т. д.) - PullRequest
3 голосов
/ 13 декабря 2010

Есть какое-либо решение для добавления пространств имен без префикса (я имею в виду эти 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'})

плохая идея?

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

Ответы [ 3 ]

3 голосов
/ 13 декабря 2010

У меня есть только обходной путь для вас.

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

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)

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

1 голос
/ 02 февраля 2012

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

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)
0 голосов
/ 24 июля 2013

Я использую 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.

...