删除标签时,Python Elementree错误

时间:2019-06-03 11:30:33

标签: xml python-2.7 elementtree

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

   #removing sysId from comparison
    for rm1 in xml_root1.findall('.//sysId'):
    xml_root1.remove(rm1)

代码给了我这个错误:

 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中的所有元素,甚至是child,孙子元素,并删除名为sysId的元素。你能帮我解决这个问题吗?

xml结构类似于:

<root>
    <sysId></sysId>
    <b></b>
    <c>
        <sysId></sysId>
    </c>
    <d>
        <e>
            <sysId></sysId>
        </e>
    </d>
</root>

1 个答案:

答案 0 :(得分:1)

在ElementTree中,删除元素要比在lxml中完成更多工作,因为lxml具有curl -X POST \ 'https://graph.facebook.com/v3.3/act_<ACT_ID>/adcreatives?access_token=<TOKEN>' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Host: graph.facebook.com' \ -d 'link_url=<URL>&name=<CREATIVE_NAME>&object_type=PAGE&object_story_spec={page_id:<PAGE_ID>,photo_data:{image_hash:<HASH>,caption:<CAPTION>}}' 功能。

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

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

示例...

sysId

打印输出...

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)

这里是lxml的示例,用于显示差异(与上述打印输出相同)...

<root>
    <b />
    <c>
        </c>
    <d>
        <e>
            </e>
    </d>
</root>