Хотите удалить все дочерние элементы при удалении элемента с помощью lxml - PullRequest
0 голосов
/ 30 декабря 2018

Не могу понять, как удалить элемент framelineName и все вложенные элементы.В нижней части оператора else будет удален только элемент framelineName.Я также хочу удалить 'line', 'left' и 'right'.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from lxml import etree as ET


def cash_rules_everything_around_me():
    shaolin = ET.SubElement(root, "Shaolin")
    wtClan = ET.SubElement(root, "wtClan")
    wtClan.set('StatenIsland', 'NYC')
    RZA = ET.SubElement(shaolin, "RZA")
    RZA.set('StatenIsland', 'NYC')
    gf = ET.SubElement(RZA, "GhostfaceKillah")
    rk = ET.SubElement(RZA, "Raekwon")
    wutang = "36 chambers"

    for wu in wutang:
        if wu != "36 chambers":
            wtClan.text = "A Tribe Called Quest"

        else:
            for w in root.xpath("//wtClan [@StatenIsland=\'NYC']"):
            w.getparent().remove(w)
            tree = ET.ElementTree(root)
            tree.write("wutang.xml", pretty_print=True, xml_declaration=True, encoding='UTF-8')


if __name__ == '__main__':
    root = ET.Element("HipHop")
    cash_rules_everything_around_me()

1 Ответ

0 голосов
/ 31 декабря 2018

Чтобы удалить элемент, вам нужен фактический объект элемента, а не список, который является возвращением lxml's xpath.Рассмотрим findall для итерации по элементу и переместим логику xpath в оператор if:

...
# ITERATE THROUGH A LIST (NOT STRING)
for wu in [wutang]:
    if wu != "36 chambers":
        wtClan.text = "A Tribe Called Quest"

    else:
        for w in root.findall("//wtClan"):
            if w.attributed['StatenIsland']
               root.remove(w)

tree = ET.ElementTree(root)
tree.write("wutang.xml", pretty_print=True, 
           xml_declaration=True, encoding='UTF-8')

Rextester demo (с использованием встроенного etree, носовместим с lxml)

...