Python lxml E-Factory

Joe*_*e J 4 python xml lxml elementtree

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

<url>
  <date-added>2011-11-11</date-added>
</url>
Run Code Online (Sandbox Code Playgroud)

但是,使用电子工厂,我不知道如何在'数据添加'元素中指定破折号.它似乎将破折号解释为减号.

这是我一直提到的文档: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
Run Code Online (Sandbox Code Playgroud)

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

谢谢您阅读此篇.

Joh*_*hin 8

说明:之后放置的内容E.需要是有效的Python标识符.这包括下划线但不包括连字符.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')
Run Code Online (Sandbox Code Playgroud)

然后DATE_ADDED像你现在一样使用.

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


jro*_*jro 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
Run Code Online (Sandbox Code Playgroud)

要解决它,只需date-added通过提供名称作为参数来更加详细地创建标记:

>>> etree.tostring(E.url(E('date-added', '2011-11-11')))
'<url><date-added>2011-11-11</date-added></url>'
Run Code Online (Sandbox Code Playgroud)