我有一个xml
我用API输出中的objectify进行了解析,并将其称为"结果"变量。现在我想要保留对象,但只更改文本文件并将其返回给API以更新元素。
<field xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="multi_text_area">
<id>1754</id>
<name>Devices under maintenance</name>
<read_only>false</read_only>
<text_area>
<text>defwhanld12x</text>
</text_area>
</field>
当我尝试更改文本时,我得到一个错误:
result.text_area.text = 'This is a test'
TypeError:属性&#39; text&#39; &#39; ObjectifiedElement&#39;对象不是 可写
我还尝试剥离元素并重新创建它,因为lxml
文档说您无法更改对象。
etree.strip_elements(result, 'text')
etree.SubElement(result.text_area, 'text').text = 'This is just a test'
但是得到了类似的错误:
TypeError:属性&#39; text&#39; &#39; StringElement&#39;对象不可写
答案 0 :(得分:1)
这是因为您的元素名为text
。 text
也使用lxml.objectify
来存储元素的内部文本,以及冲突的发生方式。执行result.text_area.text
时,会将其解释为尝试访问text_area
的内部文本,而不是访问名为text
的子元素。您可以通过访问text
元素来避免此冲突,如下所示:
result.text_area['text'] = 'This is a test'
更新:
以上结果是用新文本替换整个<text>
元素,最终作为您在下面评论中提到的表单中的元素:
<text xmlns:py="http://codespeak.net/lxml/objectify/pytype"
py:pytype="str">This is a test</text>
更新text
元素内部文字的正确方法是使用_setText()
,如this other answer中所述:
result.text_area['text']._setText('This is a test')