从etree中删除节点但留下子节点 [英] Remove a node from etree but leaving child

查看:202
本文介绍了从etree中删除节点但留下子节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在遍历XML树,并且通过从树中提取一个节点离开它们的内部节点而遇到麻烦。

Im traversing a XML tree and im having some troubles by extracting a node from the tree leaving their inner nodes.

例如:

<xml>
    <letter name="B">
        <letter name="D">
            <letter name="E">
                <letter name="F">
                    <letter name="G">

                    </letter>
                </letter>
            </letter>
        </letter>
    </letter>
</xml>

我需要这样的东西:

<xml>
    <letter name="B">
        <letter name="D">
                <letter name="F">
                    <letter name="G">

                    </letter>
                </letter>
        </letter>
    </letter>
</xml>

但是我无法在不删除所有E个孩子的情况下得到它。

But i cant get this with out removing all E childs.

干杯!

推荐答案

想法是找到字母元素为 name = E 获取其父项删除元素从父级开始,并使用元素的子级扩展父级:

The idea is to find the letter element with name="E", get it's parent, remove the element from parent and extend the parent with element's children:

import xml.etree.ElementTree as etree

data = """
<xml>
    <letter name="B">
        <letter name="D">
            <letter name="E">
                <letter name="F">
                    <letter name="G">

                    </letter>
                </letter>
            </letter>
        </letter>
    </letter>
</xml>
"""

XPATH = './/letter[@name="E"]'

tree = etree.fromstring(data)
letter = tree.find(XPATH)
parent = tree.find(XPATH + '/..')

parent.remove(letter)
parent.extend(letter)

print etree.tostring(tree)

它打印:

<xml>
    <letter name="B">
        <letter name="D">
            <letter name="F">
                    <letter name="G">

                    </letter>
                </letter>
            </letter>
    </letter>
</xml>

UPD(使用迭代方法):

UPD (using iterative approach):

def iterparent(tree):
    for parent in tree.getiterator():
        for child in parent:
            yield parent, child

tree = etree.fromstring(data)
for parent, child in iterparent(tree):
    if child.tag == "letter" and child.attrib.get('name') == "E":
        parent.remove(child)
        parent.extend(child)

print etree.tostring(tree)

iterparent()函数摘自 访问父母 文档中的段落。

iterparent() function is taken from Accessing Parents paragraph from docs.

这篇关于从etree中删除节点但留下子节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆