【问题标题】:Want to remove all children when removing an element with lxml想要在使用 lxml 移除元素时移除所有子元素
【发布时间】:2019-05-27 04:13:10
【问题描述】:

似乎无法弄清楚如何删除元素“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()

【问题讨论】:

  • 什么是root?您是否正在构建 XML 并删除其元素?请包含更完整的上下文代码块和minimal reproducible example
  • 更新了...用一些新的名称和变量。
  • 很好的例子!但是,为什么要从您正在构建的 XML 中删除元素呢?为什么不按逻辑有条件地创建元素和子元素?通常从先前构建和解析的 XML 中删除。
  • 例子很到位,哈哈。我必须删除一些东西(或者可能有其他方法!)因为这是我正在制作的应用程序。对于这个问题,您从组合框中选择了一些东西,它需要替换或删除 XML 中的所有这些设置。 SubElement 和所有子元素都需要换出/删除。我有这个项目分布在多个 .py 文件中。到目前为止一切正常,除了这个问题。
  • 看起来 Beautiful Soup 更容​​易构建/编辑/添加/解析/等 .xml 树

标签: python lxml


【解决方案1】:

要删除一个元素,您需要实际的元素对象而不是一个列表,它是 lxml 的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

【讨论】:

    猜你喜欢
    • 2013-02-07
    • 2022-08-23
    • 2018-03-19
    • 1970-01-01
    • 2013-04-22
    • 2011-07-15
    • 1970-01-01
    • 2017-12-05
    • 2013-10-31
    相关资源
    最近更新 更多