在Python ElementTree中动态添加/删除注释

时间:2017-02-16 12:05:53

标签: python xml

我花了一些时间来研究这个问题,然后我就空白了。

我是Python的新手,我正在尝试逐步浏览我的xml文件,基本上如果某些内容不活动,请注释掉一个特定的元素,如果有效则取消注释。检查是否有效是正常的,只是随后的评论进入或退出我已经碰壁了。我正在使用python 2.7

我的结构非常简单:

<?xml version="1.0" encoding="utf-8"?>
<smil xmlns="http://www.w3.org/2001/SMIL20/Language">
  <head>
    <meta name="a" content="some stuff" />
    <meta name="b" content="things and stuff" />
    <meta name="c" content="rubbish stuff" />
    <groupStuff id="foo">
      <meta name="thing" content="wibble" />
    </groupStuff>
    <groupStuff id="bar">
      <meta name="thing" content="bibble" />
    </groupStuff>
  </head>
  <body>
  </body>
</smil>

因此,如果非活动注释掉节点,则如果激活则返回。

我认为这将是相当直接的,可能是但我完全被卡住了

1 个答案:

答案 0 :(得分:0)

从技术上讲,您可以使用其字符串表示形式的注释节点替换元素:

#!/usr/bin/env python
import xml.etree.ElementTree as ET

root = ET.XML("""<?xml version="1.0" encoding="utf-8"?>
<smil xmlns="http://www.w3.org/2001/SMIL20/Language">
  <head>
    <meta name="a" content="some stuff" />
    <meta name="b" content="things and stuff" />
    <meta name="c" content="rubbish stuff" />
    <groupStuff id="foo">
      <meta name="thing" content="wibble" />
    </groupStuff>
    <groupStuff id="bar">
      <meta name="thing" content="bibble" />
    </groupStuff>
  </head>
  <body>
  </body>
</smil>""")

parent = root.findall(".//*[@name='a']/..")[0]
child = parent.findall(".//*[@name='a']")[0]

commented = ET.tostring(child)

parent.remove(child)
parent.append(ET.Comment(commented))

print ET.tostring(root)

如果订单很重要,您可以使用insert代替append

取消注释可能需要使用一些标记来区分禁用的元素和真正的注释。但基本上你要将评论数据解析为自己的元素,并以类似的方式将其替换为树。