我一直在使用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
有没有人知道让它用破折号正确渲染元素的技巧?
感谢您阅读本文。
乔
答案 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>'