2015-03-26 4 views
0

У меня проблема с 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

xmlRoot.findall('documentation') в коде ничего не нашли, потому что <documentation> не является прямым потомком корневого элемента <data>. Это на самом деле прямой потомок <config>:

«Element.findall() находит только элементы с тегом, которые являются прямыми потомками текущего элемента». [19.7.1.3. Finding interesting elements]

Это один из возможных способов удаления всех детей <config> с помощью findall() данного образца XML вы размещены (и при условии, что фактический 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) 
...... 
+0

Благодарим вас за пример. Я вижу, где я ошибался, основываясь на том, что вы предоставили. Однако в исходном примере XML я просто поместил пару элементов под ** **. Я просто хочу удалить элементы **

Смежные вопросы