无法使用 ElementTree 删除 element/node
Unable to remove element/node using ElementTree
我对 ElementTree 有一个问题,我不太明白。我已经阅读了他们所有的文档以及我可以在这个论坛上找到的所有信息。我有几个 elements/nodes 正在尝试使用 ElementTree 删除。我没有收到以下代码的任何错误,但是当我查看写入更改的输出文件时,我希望删除的 elements/nodes 仍然存在。我有一个如下所示的文档:
<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>
xmlRoot.findall('documentation')
在您的代码中没有找到任何内容,因为 <documentation>
不是根元素 <data>
的直接子元素。它实际上是 <config>
的直接子代:
"Element.findall() finds only elements with a tag which are direct children of the current element". [19.7.1.3. Finding interesting elements]
这是使用 findall()
给定样本 XML 删除 <config>
的所有子项的一种可能方法(并假设实际 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)
......
我对 ElementTree 有一个问题,我不太明白。我已经阅读了他们所有的文档以及我可以在这个论坛上找到的所有信息。我有几个 elements/nodes 正在尝试使用 ElementTree 删除。我没有收到以下代码的任何错误,但是当我查看写入更改的输出文件时,我希望删除的 elements/nodes 仍然存在。我有一个如下所示的文档:
<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>
xmlRoot.findall('documentation')
在您的代码中没有找到任何内容,因为 <documentation>
不是根元素 <data>
的直接子元素。它实际上是 <config>
的直接子代:
"Element.findall() finds only elements with a tag which are direct children of the current element". [19.7.1.3. Finding interesting elements]
这是使用 findall()
给定样本 XML 删除 <config>
的所有子项的一种可能方法(并假设实际 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)
......