无法使用ElementTree删除元素/节点

时间:2015-03-26 23:27:23

标签: python xml python-2.7 lxml elementtree

我对ElementTree有一个问题,我无法弄明白。我已经阅读了他们所有的文档以及我在这个论坛上可以找到的所有信息。我有几个元素/节点,我试图使用ElementTree删除。我没有得到以下代码的任何错误,但是当我查看输出文件时我写了更改,我期望删除的元素/节点仍然存在。我有一个看起来像这样的文件:

<data>
  <config>
    <script filename="test1.txt"></script>
    <documentation filename="test2.txt"></script>
  </config>
</data>

我的代码如下:

import xml.etree.ElementTree as ElementTree    
xmlTree = ElementTree.parse(os.path.join(sourcePath, "test.xml"))
xmlRoot = xmlTree.getroot()
for doc in xmlRoot.findall('documentation'):
     xmlRoot.remove(doc)

xmlTree.write(os.path.join(sourcePath, "testTWO.xml"))

结果是我得到以下文件:

<data>
  <config>
    <script filename="test1.txt" />
    <documentation filename="test2.txt" />
  </config>
</data>

我需要的是更像这样的东西。我没有使用ElementTree。如果有一个更好的解决方案与lxml或其他库,我都是耳朵。我知道ElementTree有时会有点痛苦。

<data>
  <config>
  </config>
</data>

1 个答案:

答案 0 :(得分:1)

代码中的

xmlRoot.findall('documentation')没有找到任何内容,因为<documentation>不是根元素<data>的直接子元素。它实际上是<config>的直接孩子:

  

“Element.findall()仅查找带有标记的元素,这些元素是当前元素的直接子元素”。 [19.7.1.3. Finding interesting elements]

这是使用<config>给出的示例XML删除findall()的所有子项的一种可能方法(并假设实际的XML已使用正确的结束标记关闭<documentation>元素而不是已关闭</script>):

......
config = xmlRoot.find('config')

# find all children of config
for doc in config.findall('*'):
    config.remove(doc)
    # print just to make sure the element to be removed is correct
    print ElementTree.tostring(doc)
......