如何在继承自lxml.ElementBase的对象中自定义名称空间前缀

时间:2012-02-13 18:05:02

标签: python lxml

从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 个答案:

答案 0 :(得分:3)

我知道这是旧的,可​​能@rds解决了这个问题,但我遇到了类似的问题,所以我想分享一下som信息。 似乎在创建时设置nsmap至少可以起作用:

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