Как настроить префикс пространства имен в объектах, наследуемых от lxml.ElementBase - PullRequest
3 голосов
/ 13 февраля 2012

Из документации lxml я понимаю, что пользовательские элементы XML должны наследоваться от ElementBase.

Например, я могу создать

class FactVariable(etree.ElementBase):
    ''' Class that represents a XBRL fact variable.'''
    TAG = '{http://xbrl.org/2008/variable}factVariable'

    @property
    def label(self):
        return self.attrib['{http://www.w3.org/1999/xlink}label']

    @label.setter
    def label(self, value):
        self.attrib['{http://www.w3.org/1999/xlink}label'] = value

Моя проблема заключается в том, что при созданииВ дереве XML и размещении таких узлов я получаю

<ns0:factVariable xmlns:ns0="http://xbrl.org/2008/variable" label="azerty"/> 

Вопрос : я хочу, чтобы к пространству имен был добавлен префикс va, а не ns0 Как я могу это изменить?

Я попытался установить свойство self.nsmap, но у меня есть исключение «только для чтения».Добавление ключа / значения не имеет никакого эффекта (как сказано в документации).

Я тоже пытался, но безуспешно

etree.register_namespace('va', 'http://xbrl.org/2008/variable')

1 Ответ

3 голосов
/ 13 июля 2012

Я знаю, что это старо, и, вероятно, @rds решил это, но я столкнулся с подобной проблемой, поэтому подумал, что поделюсь информацией о соме. Кажется, что установка nsmap при создании будет, по крайней мере, работать:

>>> etree.tostring(FactVariable(label='qwerty', nsmap={'va':'http://xbrl.org/2008/variable'}))
'<va:factVariable xmlns:va="http://xbrl.org/2008/variable" label="qwerty"/>'
...