[英]Python Xml Parsing having CDATA
我在 xml 以下,需要更新 CDATA 部分中的值以获取标签。 我尝试使用元素树来解析使用 xpath 直到 vsdata,能够获取 CDATA 并更新 f1 的值。 但问题是更新后,在更新的 xml 中,只有 CDATA 的内容仍然是 xml 的 rest 的内容。
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)
output
<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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.