如何使用 lxml builder/E-factory 在 XML 标签中使用点
How to use dot in XML tag using lxml builder/E-factory
(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
。
ElementMaker
允许您将元素名称作为字符串传递。
for term in terms:
xmlrecord = E.record(
E("term.ID", term) # This works
)
(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
。
ElementMaker
允许您将元素名称作为字符串传递。
for term in terms:
xmlrecord = E.record(
E("term.ID", term) # This works
)