2012-02-13 62 views
3

從lxml文檔中,我明白自定義XML元素應該從ElementBase繼承。如何自定義繼承自lxml.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') 

回答

3

我知道這是舊的,可​​能@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"/>'