python - 具有 CDATA 的 Python Xml 解析
问题描述
我有以下 xml,因此需要更新 CDATA 部分中的值 tag 。我尝试使用元素树来解析使用 xpath 直到 vsdata,能够获取 CDATA 并更新 f1 的值。但问题是更新后,在更新的 xml 中,只有 CDATA 的内容仍然存在,其余的 xml 不可见。
rootElement=rootElement.findall(xpath)[0] -> Xpath till vsdata.
rootElement=et.fromstring(rootElement.iter().next().text)
for each in rootElement[0]:
if each.tag == paramname:
each.text = str(valueToSet)
print(each.tag, each.text)
<config>
<subconfig>
<a>First Cell</a>
<b>Second Cell</b>
<vsDataContainer>
<id>0</id>
<vsData><![CDATA[
<g>
<f>
<f1>10</f1>
<f2>20</f2>
<f3>30</f3>
</f>
</g>
]]></vsData>
</vsDataContainer>
</subconfig>
</config>
After updating in new xml only following is remained
<g>
<f>
<f1>50</f1>
<f2>20</f2>
<f3>30</f3>
</f>
</g>
But i need it as original with value f1 updated to new value, Could somebody help on this?
<config>
<subconfig>
<a>First Cell</a>
<b>Second Cell</b>
<vsDataContainer>
<id>0</id>
<vsData><![CDATA[
<g>
<f>
<f1>50</f1>
<f2>20</f2>
<f3>30</f3>
</f>
</g>
]]></vsData>
</vsDataContainer>
</subconfig>
</config>
解决方案
以下
import xml.etree.ElementTree as ET
xml = '''<config>
<subconfig>
<a>First Cell</a>
<b>Second Cell</b>
<vsDataContainer>
<id>0</id>
<vsData><![CDATA[
<g>
<f>
<f1>10</f1>
<f2>20</f2>
<f3>30</f3>
</f>
</g>
]]></vsData>
</vsDataContainer>
</subconfig>
</config>'''
f1_new_value = '999'
root = ET.fromstring(xml)
vs_data = root.find('.//vsData')
inner_xml = vs_data.text.strip()
inner_root = ET.fromstring(inner_xml)
inner_root.find('.//f1').text = f1_new_value
vs_data.text = '![CDATA[' + ET.tostring(inner_root).decode('utf-8') + ']]'
root_str = ET.tostring(root)
root_str = str(root_str.decode('utf-8').replace('<', '<').replace('>', '>').replace('\\n', ''))
print(root_str)
输出
<config>
<subconfig>
<a>First Cell</a>
<b>Second Cell</b>
<vsDataContainer>
<id>0</id>
<vsData>![CDATA[<g>
<f>
<f1>999</f1>
<f2>20</f2>
<f3>30</f3>
</f>
</g>]]</vsData>
</vsDataContainer>
</subconfig>
</config>
推荐阅读
- html - 从页面的全宽开始到结束,如何在标题内有一个容器的背景?
- html - 如果电子邮件已存在或为空,请检查文本输入
- cmake - CMake 错误:找不到 VTK 文件
- azure - Azure kubernetes - Istio 和多个 kubernetes 应用程序?
- reactjs - 我可以在函数中调用 React Hook 吗?
- python - 如何从非正常数据框中绘制一些数据?
- node.js - 获取语音通道中自闭者的 ID
- android - 从firestore按时间戳降序排列数据
- c# - unity 方法只运行第一行代码
- javascript - 从 ajax 请求将 API 对象返回到全局范围