问题描述
我花了一些时间对此进行研究,但我空白了。
我对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楼
从技术上讲,您可以用元素的字符串表示形式的注释节点替换元素:
#!/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
。
取消注释可能需要使用一些标记来将禁用元素与真正注释区分开。 但基本上,您会将注释数据解析为自己的元素,并以类似的方式将其替换到树中。