【问题标题】:Python lxml the E-FactoryPython lxml 电子工厂
【发布时间】:2011-12-25 01:33:03
【问题描述】:

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

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

但是,使用 E-factory,我不确定如何在“添加数据”元素中指定破折号。它似乎将破折号解释为减号。

这是我一直在参考的文档: 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

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

感谢您阅读本文。

【问题讨论】:

    标签: python xml lxml elementtree


    【解决方案1】:

    说明: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) 如果架构在您的控制之下,请使用下划线 (date_added) 而不是连字符 (date-added)。

    【讨论】:

    • 感谢您的解决方案。这是使用 getattr 方法的好方法。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的解决方案。它似乎运作良好,并帮助我从不同的角度看待神秘的“E”物体正在发生的事情。感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    相关资源
    最近更新 更多