繁体   English   中英

Python Xml 解析有 CDATA

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM