2011-11-09 49 views
3

我一直在使用lxml「E-Factory」(又名ElementMaker)來創建XML文檔。我想產生類似這樣的XML文檔:Python lxml E-Factory

<url> 
    <date-added>2011-11-11</date-added> 
</url> 

然而,使用E-工廠,我不知道如何指定在「添加數據」元素的衝刺。這似乎將破折號解釋爲一個負號。

這裏是我已經提到的文檔: http://lxml.de/tutorial.html#the-e-factory

下面是如何重現錯誤:

from lxml import etree 
from lxml.builder import ElementMaker 

E = ElementMaker() 
URL = E.url 
DATE_ADDED = E.date-added 

xml = URL(DATE_ADDED(myobject.created.strftime('%Y-%m-%dT%H:%M:%S')),) 


NameError global name 'added' is not defined 

有誰知道一招,把它做正確渲染元素與短跑?

感謝您閱讀本文。

回答

6

ElementMaker的功能映射到一個標籤名稱(通過使用例如E.date_added)建立XML樹。但是,HTML/XML標記和Python函數中的允許字符之間存在差異。如PEP 8中所述:「封裝和模塊名稱模塊應該有短的全小寫名稱。如果提高了可讀性,可以在模塊名稱中使用下劃線」。所以,date_added功能包括下劃線,這是不允許存在於一個Python函數:

>>> def foo-bar(): 
    File "<stdin>", line 1 
    def foo-bar(): 
     ^
SyntaxError: invalid syntax 

要解決這個問題,只是作爲參數提供的名稱創建date-added標籤多一點,而不是冗長:

>>> etree.tostring(E.url(E('date-added', '2011-11-11'))) 
'<url><date-added>2011-11-11</date-added></url>' 
+0

感謝您的解決方案。它似乎工作得很好,並幫助我以不同的角度來看待神祕的「E」對象正在發生的事情。感謝您的答覆。 –

7

說明:您後E.需要把什麼是一個valid Python identifier。這包括下劃線而不是連字符。 E.date-added被編譯爲「成功」,就好像它是(E.date) - added,但隨後在運行時失敗,因爲(在您的情況下)added未定義。

替代方案:

(1)E.tag只是一個化妝品的技巧,並不適用於所有合法的XML標籤的工作。實際上,Python對象屬性可以是任何舊垃圾,但你不能在源代碼中執行obj.really+funky%attribute*name,dude。一個啞彈技巧值得更好的竅門:你可以把元素創建即相同的模式並不需要每次創建一個元素時做指定標籤:因爲你現在做

DATE_ADDED = getattr(E, 'date-added') 

,然後使用DATE_ADDED 。 (2)如果模式在您的控制之下,請使用下劃線(日期添加)而不是連字符(添加日期)。

+0

感謝您的解決方案。這是使用getattr方法的好方法。 –