当前位置: 代码迷 >> python >> 在Python ElementTree中动态添加/删除注释
  详细解决方案

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

热度:92   发布时间:2023-06-16 14:03:20.0

我花了一些时间对此进行研究,但我空白了。

我对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>

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

我以为这很简单,也许是,但是我完全被卡住了

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

#!/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

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