在保留属性的同时使用lxml.objectify替换节点文本

时间:2010-01-27 22:37:22

标签: python xml lxml

像这样使用lxml.objectify

from lxml import objectify

o = objectify.fromstring("<a><b atr='someatr'>oldtext</b></a>")

o.b = 'newtext'

导致<a><b>newtext</b></a>,导致节点属性丢失。它似乎是直接用新创建的元素替换元素,而不是简单地替换元素的文本。

如果我尝试使用o.b.text = 'newtext',它会告诉我 attribute 'text' of 'StringElement' objects is not writable

有没有办法在客观化中做到这一点,而不必将其分解为不同的元素并涉及etree?我只想替换内部文本,同时保留节点的其余部分。我觉得我在这里缺少一些简单的东西。

1 个答案:

答案 0 :(得分:9)

>>> type(o.b)
<type 'lxml.objectify.StringElement'>

您正在用普通字符串替换元素。您需要将其替换为新的字符串元素。

>>> o.b = objectify.E.b('newtext', atr='someatr')

出于某种原因,你不能这样做:

>>> o.b.text = 'newtext'

但是,这似乎有效:

>>> o.b._setText('newtext')