Python lxml更改xml对象子文本属性

时间:2016-12-30 09:00:32

标签: python lxml

我有一个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;对象不可写

1 个答案:

答案 0 :(得分:1)

这是因为您的元素名为texttext也使用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')