Python lxml E-Factory

时间:2011-11-09 06:37:25

标签: python xml lxml elementtree

我一直在使用lxml“E-Factory”(又名ElementMaker)来创建xml文档。我正在尝试生成类似于此的xml文档:

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

但是,使用电子工厂,我不知道如何在'data-added'元素中指定破折号。它似乎将破折号解释为减号。

这是我一直提到的文档: 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

有没有人知道让它用破折号正确渲染元素的技巧?

感谢您阅读本文。

2 个答案:

答案 0 :(得分:8)

说明:您在E.之后需要成为valid Python identifier的内容。这包括下划线但不包括连字符。 E.date-added已“成功”编译,就好像它是(E.date) - added但在运行时失败,因为(在您的情况下)added未定义。

替代方案:

(1)E.tag只是一个整合技巧,不适用于所有合法的XML标签。实际上,Python对象属性可以是任何旧的垃圾,你只能在源代码中执行obj.really+funky%attribute*name,dude。一个dud技巧值得一个更好的技巧:你可以保持相同的元素创建模式,即每次创建元素时都不需要指定标记:

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

然后像现在一样使用DATE_ADDED

(2)如果架构在您的控制之下,请使用下划线(date_added)而不是连字符(添加日期)。

答案 1 :(得分:7)

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>'