Удалить элемент и дочерние элементы из XML с помощью elementtree Python - PullRequest
0 голосов
/ 26 сентября 2018

Попробовал несколько разных библиотек сейчас и думаю, что я близок, но не могу разобраться в этой проблеме.

У меня есть XML-файл с некоторыми вложенными таблицами, которые я хочу удалить.Это несколько уровней иерархии XML.

Пока я пробовал это ...

import xml.etree.ElementTree as ET
import os

tree = ET.parse('/Users/me/file.xml')
root = tree.getroot()

for sect1 in root.findall('section1'):
    for sect2 in sect1.iter() :
        if sect2.tag == 'table':
            sect1.remove(sect2)

Однако я получаю сообщение об ошибке:

ValueError: list.remove(x): x not in list

Я могууспешно удалите разделы документа с верхнего уровня иерархии, используя следующий код:

import xml.etree.ElementTree as ET
import os

tree = ET.parse('/Users/me/file.xml')
root = tree.getroot()

for sect1 in root.findall('section1'):
    root.remove(sect1)

Мне просто не хватает, как удалить элементы, которые находятся ниже верхнего уровня.

Любойочень признателен за помощь.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Я использую minidom для разбора XML-файлов и строк, и с minidom очень легко делать все, что вы хотите, и это пример, который вы запросили, но используя библиотеку xml.dom.minidom: -

from xml.dom.minidom import parse

doc = parse('/Users/me/file.xml')
root = doc.documentElement

for parent in root.childNodes:
    for child in parent.childNodes:
        if(child.tagName == 'table'):
            parent.removeChild(child)
0 голосов
/ 26 сентября 2018

используйте это:

for sect1 in root.findall('.//section1'):
root.remove(sect1)

.// выбирает из всех дочерних элементов section1 из первого элемента.Вы можете быть более конкретным, выбирая элементы с помощью './section1/section2', также можно выбирать элементы с определенными атрибутами с помощью ./section1[@Name="SomeValueForNameAttribute"]', если вы хотите узнать больше, это называется xpath, а развернутая версия, которую предлагает дерево элементов, документирована здесь

...