Python LXML:修改CDATA

时间:2016-06-06 15:54:55

标签: python lxml cdata lxml.objectify

当我操作使用Python LXML模块解析的XML时(特别是>>> from lxml import objectify, etree >>> xml = ''' <Root> <Child> <![CDATA[abcd]]> </Child> </Root> ''' >>> parser = objectify.makeparser(strip_cdata=False) >>> parsed = objectify.XML(xml, parser=parser) >>> etree.tostring(parsed) '<Root><Child><![CDATA[abcd]]></Child></Root>' >>> type(parsed.Child) <type 'lxml.objectify.StringElement'> >>> parsed.Child.text 'abcd' >>> parsed.Child = 'efgh' >>> etree.tostring(parsed) '<Root><Child xmlns:py="http://codespeak.net/lxml/objectify/pytype" py:pytype="str">efgh</Child></Root>' ,但我认为它没有区别),我该如何保留CDATA?

鉴于以下结果:

<![CDATA[....]>

我希望最后一行仍有<Child>。但我无法看到任何保留它或重新创建它的方法。尝试访问this.subtract(this.divideToIntegralValue(divisor).multiply(divisor))元素的内容会产生一个裸字符串,修改该元素的内容会神奇地消失CDATA部分。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

>>> from lxml import etree
>>> parser = etree.XMLParser(strip_cdata=False)
>>> parsed = etree.XML('''
...   <Root>
...    <Child>
...     <![CDATA[abcd]]>
...    </Child>
...   </Root>
... ''', parser)
>>> print etree.tostring(parsed)
<Root>
   <Child>
    <![CDATA[abcd]]>
   </Child>
  </Root>
>>> parsed.getchildren()[0].text = etree.CDATA('efgh updated')
>>> etree.tostring(parsed)
'<Root>\n   <Child><![CDATA[efgh updated]]></Child>\n  </Root>'
>>>