2011-11-09 48 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方法的好方法。 –