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('&lt;', '<').replace('&gt;', '>').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>