【问题标题】:Python LXML: Modify CDATAPython LXML:修改 CDATA
【发布时间】:2016-06-06 15:54:55
【问题描述】:

当我使用 Python LXML 模块(特别是 lxml.objectify,但我认为这没有什么区别)处理 XML 解析时,如何保留 CDATA?

鉴于以下结果:

>>> 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>'

我希望最后一行仍然有 &lt;![CDATA[....]&gt;。但我看不到任何保存或重建它的方法。尝试访问 &lt;Child&gt; 元素的内容会产生一个裸字符串,并且修改该元素的内容会神奇地消失 CDATA 部分。

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

【问题讨论】:

  • 请注意,&lt;![CDATA[x]]&gt;x 如果不包含特定于 xml 的字符,则它们是相同的。为什么需要它说 CDATA?
  • 因为它为那些关注差异的遗留软件提供了支持。

标签: python lxml cdata lxml.objectify


【解决方案1】:
>>> 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>'
>>>

【讨论】:

  • 不好 - 这会产生'&lt;Root&gt;&lt;Child&gt;&amp;lt;lxml.etree.CDATA object at 0x7f3ab54a9e70&amp;gt;&lt;/Child&gt;&lt;/Root&gt;'
  • 这可能与 objectify 库有关。我只使用解析器更新了答案。
  • 是的,这就是我最终所做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 2015-01-17
  • 2021-09-09
  • 2017-07-16
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多