【问题标题】:Python Xml Parsing having CDATA具有 CDATA 的 Python Xml 解析
【发布时间】:2020-07-01 01:48:31
【问题描述】:

我有以下 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>

【问题讨论】:

    标签: python xml parsing cdata


    【解决方案1】:

    下面

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      相关资源
      最近更新 更多