python - lxml.etree 不能在 python 3 中使用 cdata

标签 python xml python-3.x lxml cdata

我想用 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/

相关文章:

python-3.x - 数据透视表中每个级别的小计

python - 在python中按顺序对文件重新编号

python - 我可以有条件地使用 pandas read_csv 转换器吗?

c++ - 如何将 Python 编译成 C++ .exe

android - 在Android中将px转换为dp和sp in/values/dimen.xml

javascript - 将解析后的 XML 数据绑定(bind)到 AngularJS 变量

xml - 如何使用 sed 从两个 xml 标记之间提取文本

python - 为什么在这个函数中使用self?

python - 使用列表循环将变量添加到元组

python - 设置 tkinter.ttk.Treeview 列中文本的格式