lxml.etree 将元素插入 element.text

lxml.etree insert elements into element.text

我的字符串中有空 xml 元素,如下所示:

>>> s = """fizz buzz <pb n="44"/> bananas"""

已使用 etree.SubElement 方法将这些字符串分配给 xml 个元素:

>>> from lxml import etree as et
>>> root = et.Element('root')
>>> txt = et.SubElement(root, 'text')
>>> txt.text = s
>>> et.dump(root)
<root>
  <text>fizz buzz &lt;pb n="44"/&gt; bananas</text>
</root>

摆弄 re.split() 和 etree 的 texttail 我可以在 txt.text 中我想要的地方插入一个子元素 <pb n="44"/>;然而,有时我在字符串中多次出现 <pb/> 元素,这使事情变得复杂:

>>> s1 = """foo bar <pb n="42"/> parrots like <pb n="43"/> eggs and spam"""

有没有一种直接的方法可以将这些元素插入到现有元素的 text 中,而无需过多地摆弄 texttail

您可以使输入字符串成为格式正确的 XML 文档(以 text 作为根元素)并使用 fromstring() 将其解析为 Element 对象。然后将其附加到父级。

from lxml import etree as et

s1 = """foo bar <pb n="42"/> parrots like <pb n="43"/> eggs and spam"""
s2 = "<text>{0}</text>".format(s1)

text = et.fromstring(s2)
root = et.Element('root')
root.append(text)

et.dump(root)

输出:

<root>
 <text>foo bar <pb n="42"/> parrots like <pb n="43"/> eggs and spam</text>
</root>