首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >移除标签时出现Python元素树错误

移除标签时出现Python元素树错误
EN

Stack Overflow用户
提问于 2019-06-03 19:30:33
回答 1查看 47关注 0票数 0

我有这样的代码,用于在root_compare函数中从xml中删除所有名为sysId的标记:

代码语言:javascript
复制
   #removing sysId from comparison
    for rm1 in xml_root1.findall('.//sysId'):
    xml_root1.remove(rm1)

代码给出了这个错误:

代码语言:javascript
复制
 File "/tmp/dev_uac_api2/uac_api_lib.py", line 105, in root_compare
    xml_root1.remove(rm1)
 File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 337, in remove
    self._children.remove(element)
  ValueError: list.remove(x): x not in list

我需要遍历xml中的所有元素,甚至是子元素、孙元素,然后删除名为sysId的元素。你能帮我解决这个问题吗?

xml结构类似于:

代码语言:javascript
复制
<root>
    <sysId></sysId>
    <b></b>
    <c>
        <sysId></sysId>
    </c>
    <d>
        <e>
            <sysId></sysId>
        </e>
    </d>
</root>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-04 03:05:07

在ElementTree中删除元素要比在lxml中多做一些工作,因为lxml有getparent()函数。

在ElementTree中,首先需要匹配要删除的元素的父元素。

ElementTree's xpath support也不是很好,所以.//*[sysId]不会匹配第一个sysId元素,因为它是根元素的直接子元素。您必须将它们分开删除。

例如。

代码语言:javascript
复制
import xml.etree.ElementTree as ET

xml = """<root>
    <sysId></sysId>
    <b></b>
    <c>
        <sysId></sysId>
    </c>
    <d>
        <e>
            <sysId></sysId>
        </e>
    </d>
</root>"""

root = ET.fromstring(xml)

# find/remove direct "sysId" children of root
for child in root.findall("sysId"):
    root.remove(child)

# find elements that contain a "sysId" child element
for parent in root.findall(".//*[sysId]"):
    # find/remove direct "sysId" children of parent
    for child in parent.findall("sysId"):
        parent.remove(child)

print ET.tostring(root)

打印输出...

代码语言:javascript
复制
<root>
    <b />
    <c>
        </c>
    <d>
        <e>
            </e>
    </d>
</root>

这里有一个lxml的例子来展示不同之处(与上面相同的打印输出)……

代码语言:javascript
复制
from lxml import etree

xml = """<root>
    <sysId></sysId>
    <b></b>
    <c>
        <sysId></sysId>
    </c>
    <d>
        <e>
            <sysId></sysId>
        </e>
    </d>
</root>"""

root = etree.fromstring(xml)

for elem in root.xpath(".//sysId"):
    elem.getparent().remove(elem)

print etree.tostring(root)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56426450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档