Python Xml 正在解析 CDATA
Python Xml Parsing having CDATA
我有以下 xml,这需要更新标签的 CDATA 部分中的值。我试过元素
使用 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>
我有以下 xml,这需要更新标签的 CDATA 部分中的值。我试过元素 使用 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>