Python etree lxml 从父级移动子级

Python etree lxml moving a child from parent

我有 xml 的形式:

<b>
    <a>
        <c>some stuff</c>
        <d> some more stuff</d>
    </a>
</b>

我想将其重新格式化为:

<b>
    <c>some stuff</c>
    <a>
        <d> some more stuff</d>
    </a>
</b>

关于如何使用 Python lxml 执行此操作的任何想法?

所以我最终使用虚拟标签和 addnext 参数解决了这个问题:

def new_a(xml):
    node_b=xml.xpath('/b')[0]
    node_d=xml.xpath('/b/a/d')
    node_d[0].addnext(etree.Element('dummy_tag'))
    node_dummy=xml.xpath('/b/a/dummy_tag')
    node_dummy[0].append(node_d[0])
    etree.strip_tags(node_b,'a')
    dummies=node_b.findall('dummy_tag')
    for node in dummies:
        node.tag='a'
    return xml

所以如果:

xml_ini="<b><a><c>some stuff</c><d>some other stuff</d><e>even more stuff</e></a></b>"

xml=etree.fromstring(xml_ini)

xml_new=new_a(xml)

然后我们从这里开始:

<b>
    <a>
        <c>some stuff</c>
        <d>some other stuff</d>
        <e>even more stuff</e>
    </a>
</b>

为此:

<b>
    <c>some stuff</c>
    <a>
        <d>some other stuff</d>
   </a>
    <e>even more stuff</e>
</b>