python xml删除孙子或孙子

时间:2017-03-13 23:36:50

标签: python xml removechild

我一直在谷歌搜索从xml文件中删除孙子孙女。但是,我找不到完美的解决方案。 这是我的情况:

<tree>
    <category title="Item 1">item 1 text
        <subitem title="subitem1">subitem1 text</subitem>
        <subitem title="subitem2">subitem2 text</subitem>
    </category>

    <category title="Item 2">item 2 text
        <subitem title="subitem21">subitem21 text</subitem>
        <subitem title="subitem22">subitem22 text</subitem>
            <subsubitem title="subsubitem211">subsubitem211 text</subsubitem>
    </category>
</tree>

在某些情况下,我想删除subitem。在其他情况下,我想删除subsubitem。我知道在目前的内容中我可以这样做:

import xml.etree.ElementTree as ET

root = ET.fromstring(given_content)
# case 1
for item in root.getiterator():
    for subitem in item:
        item.remove(subitem)

# case 2
for item in root.getiterator():
    for subitem in item:
        for subsubitem in subitem:
            subitem.remove(subsubitem)

当我知道目标节点的深度时,我可以用这种风格写 。如果我只知道要删除的节点的标记名称,我应该如何实现它? 伪代码:

import xml.etree.ElementTree as ET

for item in root.getiterator():
    if item.tag == 'subsubitem' or item.tag == 'subitem':
        # remove item

如果我root.remove(item),它肯定会返回错误,因为该项不是root的直接子项。

编辑:    我无法安装任何第三方库,因此我必须使用xml解决此问题。

2 个答案:

答案 0 :(得分:1)

要移除subsubitemsubitem的实例,无论其深度如何,请考虑以下示例(请注意它使用lxml.etree而非上游ElementTree):

import lxml.etree as etree

el = etree.fromstring('<root><item><subitem><subsubitem/></subitem></item></root>')
for child in el.xpath('.//subsubitem | .//subitem'):
  child.getparent().remove(child)

答案 1 :(得分:1)

我终于通过写一个递归函数,只在 <?php if($row['userStatus'] == ('N')){ echo ' <button type="submit" class="btn btn-info"><i class="glyphicon glyphicon-ok" name="btn-activate" ></i> Activate</button>'; }else{ echo ' <button class="btn btn-default"><i class="glyphicon glyphicon-eye-close"></i> Archive</button>'; } ?> <button data-toggle="modal" data-target="#view-modal" data-id="<?php echo $row['userID']; ?>" id="getUser" class="btn btn-warning"><i class="glyphicon glyphicon-pencil"></i> Edit</button> </td> </tr> lib上为我做了这个工作。

xml

通过这样做,该函数将迭代ET中的每个节点并删除我的目标节点。

def recursive_xml(root):
    if root.getchildren() is not None:
        for child in root.getchildren():
            if child.tag == 'subitem' or child.tag == 'subsubitem':
                root.remove(child)
            else:
                recursive_xml(child)

希望这可以帮助某人限制像我这样的要求......