【问题标题】:lxml.etree insert elements into element.textlxml.etree 将元素插入 element.text
【发布时间】:2015-08-11 21:03:11
【问题描述】:

我的字符串中包含空的 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 中我想要的位置插入一个子元素&lt;pb n="44"/&gt;;但是,有时我在字符串中多次出现 &lt;pb/&gt; 元素,这使事情变得复杂:

&gt;&gt;&gt; s1 = """foo bar &lt;pb n="42"/&gt; parrots like &lt;pb n="43"/&gt; eggs and spam"""

是否有一种直接的方法可以将此类元素插入到它们属于现有元素的text 的位置,而无需过多地摆弄texttail

【问题讨论】:

    标签: xml python-2.7 lxml elementtree


    【解决方案1】:

    您可以将输入字符串设为格式良好的 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>
    

    【讨论】:

    • 噢!我绕着它跳舞的时间最长。 et.fromstring() 让它变得简单。感谢您不厌其烦地指出应该是显而易见的。
    • 很高兴能帮上忙!
    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多