我想用 LXML 将 XML 文件中的值更改为 CDATA。
当我简单地更改文本时它工作得很好,但是当使用 CDATA 时,元素的内容不会被替换。
这就是我进行 CDATA 破解的方式: https://blog.ionelmc.ro/2014/06/15/lxml-element-builder-and-cdata/
这是我更改文本值的方式(在如下所示的 XML 中的“RESPONSE”标记之间): Change text value with lxml
问题:如何将 RESPONSE 标签的内容文本更改为 CDATA?
from lxml import etree
from lxml.builder import ElementMaker
from lxml.etree import CDATA
def add_cdata(element, cdata):
assert not element.text, "Can't add a CDATA section. Element already has some text: %r" % element.text
element.text = cdata
E = ElementMaker(typemap={
CDATA: add_cdata
})
print("\nThe CDATA is working here perfectly: ")
print(etree.tostring(E.RESPONSE(CDATA('Some stuff that needs to be in a CDATA section'))))
tree = etree.fromstring('''<REQRES_MAPPING>
<REQUEST>aaa</REQUEST>
<RESPONSE>bbb</RESPONSE>
</REQRES_MAPPING>''')
print("\nThe data I need to change: ")
print(etree.tostring(tree))
response = tree.xpath("//RESPONSE")
if response:
response[0].text = 'xxx' # this is working, but I need CDATA
print("\nThe text has changed between the RESPONSE tags: ")
print(etree.tostring(tree))
if response:
response[0] = E.RESPONSE(CDATA('xxx')) # this is not working
print("\nThis is not working here: ")
print(etree.tostring(tree))
我想得到的:
<REQRES_MAPPING>
<REQUEST>aaa</REQUEST>
<RESPONSE><![CDATA[yyy]]</RESPONSE>
</REQRES_MAPPING>
很明显插入带有CDATA装饰的yyy并不是一个好的方法,因为最后LMXL会将CDATA的'<'和'>'标签改为<
和>;
。
最佳答案
通过执行 response[0] = ...
,您只是在修改名为 response
的列表,您实际上并没有触及 树
。
您需要:
tree.xpath("//RESPONSE")[0].text = CDATA('xxx')
关于python - lxml.etree 不能在 python 3 中使用 cdata,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48666567/