【问题标题】:How to use dot in XML tag using lxml builder/E-factory如何使用 lxml builder/E-factory 在 XML 标记中使用点
【发布时间】:2018-02-19 20:03:01
【问题描述】:

(Python 3.6。)我正在使用lxml builder or E-factory 为需要一些XML 标记的API 生成一些XML。假设一个特定标签必须是<term.ID>

到目前为止,我发现的 lxml 构建器示例都对 xml 标记进行了硬编码。 (我还没有找到如何使用变量来指定 xml 标签 - 可以吗?) 无论如何,这样做,标签中的点将被解释为方法点。作为一种解决方法,我首先使用下划线指定标记:

import lxml.etree
import lxml.builder

E = lxml.builder.ElementMaker() 
terms = ['eggs', 'bacon', 'sausage', 'spam']

xmllist = E.recordList()
for term in terms: 
    xmlrecord = E.record(
        E.term_ID(term)         # term_ID should become term.ID
    )    
    xmllist.append(xmlrecord)

wrap = (E.someXMLdialect())     # wrap has type <class 'lxml.etree._Element'>
wrap.append(xmllist)     

# convert wrap to string, replace the underscore in term_ID with a dot
s = lxml.etree.tostring(wrap).replace(b'term_ID', b'term.ID')
with open('sample_2.xml', 'wb') as f:
    f.write(s)

最后,我将 xml 转换为字符串,以便可以使用replace 将下划线替换为点,然后将结果写入字节流。

我选择 lxml builder 是为了便于使用和提高性能,但必须恢复到这种解决方法会降低易用性。

所以我想知道是否有更好、更 Pythonic 的方式?

请注意,E.term_ID 不是字符串。如果是,我可以使用here 中的E.term\uff0EID

【问题讨论】:

    标签: xml python-3.x lxml


    【解决方案1】:

    ElementMaker 允许您将元素名称作为字符串传递。

    for term in terms: 
        xmlrecord = E.record(
            E("term.ID", term)    # This works
        )    
    

    http://lxml.de/api/lxml.builder.ElementMaker-class.html

    【讨论】:

    • 谢谢!我想这意味着我也可以将变量用于标签。不错!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2017-03-17
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多