замена текста узла с помощью lxml.objectify при сохранении атрибутов - PullRequest
4 голосов
/ 28 января 2010

Использование 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.

Есть ли способ сделать это в пределах объекта, не разбивая его на другой элемент и не вовлекая его Я просто хочу заменить внутренний текст, оставив остальную часть узла в покое. Я чувствую, что упускаю что-то простое здесь.

1 Ответ

9 голосов
/ 28 января 2010
>>> type(o.b)
<type 'lxml.objectify.StringElement'>

Вы заменяете элемент простой строкой.Вам нужно заменить его новым строковым элементом.

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

По некоторым причинам вы не можете просто сделать:

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

Однако, похоже, это работает:

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