如何使用ElementTree从Python中的XML文档中删除节点
结构如下:如何使用ElementTree从Python中的XML文档中删除节点,python,elementtree,Python,Elementtree,结构如下: <foo> <bar> <buildCommand> <name>com.android.ide.eclipse.adt.ApkBuilder</name> <arguments> </arguments> </buildCommand> <buildCommand>
<foo>
<bar>
<buildCommand>
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
<triggers>auto,full,incremental,</triggers>
</buildCommand>
</bar>
</foo>
Python 2.7.1有remove命令,但我在remove上遇到一个错误:
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py”,删除中第337行
self.\u子项。删除(元素)
ValueError:list。删除(x):x不在列表中
更新:
*由@martijn pieters解决-第二个for循环的正确逻辑为
for tag in removeList:
parent = root.find('bar')
parent.remove(tag)
您需要从其父元素中删除该元素;不过,您需要直接获取对父对象的引用,因为没有从子对象备份的路径。在这种情况下,您必须在查找
元素的同时获得对
元素的引用
尝试从根目录中删除标记失败,因为标记不是根目录的直接子目录。谢谢!更新问题以显示您的答案。这是进行这种“XML编辑”的最具python风格的方法吗?还是我应该使用另一种方法,比如构建一个并行文档并排除该节点?我会转而使用
lxml
;它支持相同的API,但添加了更好的XPath支持以及对节点父节点的访问。我现在还没有选择lxml路线,因为我在Mac OSX 10.7上,它也没有lxml-不过,这里有一些想法供那些希望在该平台上使用lxml的人参考:我在Mac上,一直使用lxml
。-)
for tag in removeList:
parent = root.find('bar')
parent.remove(tag)