Python。使用lxml复制xml中的节点时标签不匹配

问题描述 投票:1回答:1

我是xml新手,想复制一个节点。虽然它复制了这个节点,但当我添加它时,关闭标签不匹配。下面是我正在解析的xml。

<doc>
    <branch name="release01" hash="f200013e">
        <sub-branch name="subrelease01">
            xml,sgml
        </sub-branch>
    </branch>
</doc>

下面是我用来解析xml的代码。

import lxml.etree as ET
import copy

tree = ET.ElementTree(file="doc2.xml")
root = tree.getroot()

lst_nodes = tree.findall("branch")
ele = 0

while ele < len(lst_nodes):
    ref = lst_nodes[ele]
    if (lst_nodes[ele].attrib.get("name") == "release01"):
        count = 0
        while count < 1:
            copied = copy.deepcopy(ref)
            ref.append(copied)
            count=count+1
    ele+=1

ET.dump(root)

观察到的输出结果是:

<doc>
    <branch name="release01" hash="f200013e">
        <sub-branch name="subrelease01">
            xml,sgml
        </sub-branch>
    <branch name="release01" hash="f200013e">
        <sub-branch name="subrelease01">
            xml,sgml
        </sub-branch>
    </branch>
</branch>
</doc>

你可以看到 "分支 "的结束标签是不匹配的. 谁能帮我找出我在复制或追加节点时的错误?

python xml lxml python-3.7
1个回答
2
投票

我相信,你试图产生的输出是。

<doc>
    <branch name="release01" hash="f200013e">
        <sub-branch name="subrelease01">
            xml,sgml
        </sub-branch>
    </branch>
    <branch name="release01" hash="f200013e">
        <sub-branch name="subrelease01">
            xml,sgml
        </sub-branch>
    </branch>
</doc>

你所犯的错误是,你把你的复制节点附加在了 ref 组成要素 ref 本身,而不是将您的副本 之后 ref (即你想让这个副本成为 ref 而不是子元素)。) 为了实现所需的行为,你需要将 ref 的副本附加到父元素的 ref 这可以通过使用 getparent() 方法,然后用 append() 或者更方便的是您可以直接使用Element的 addnext() 方法。

即取代 ref.append(copy)ref.addnext(copy)

addnext API参考

© www.soinside.com 2019 - 2024. All rights reserved.