Python: Несоответствие тегов при копировании узлов в xml с использованием lxml - PullRequest
1 голос
/ 17 июня 2020

Я новичок в 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>

Как видите, конечный тег «ветки» не соответствует. Может ли кто-нибудь помочь мне определить ошибку, которую я делаю при копировании или добавлении узла?

1 Ответ

2 голосов
/ 17 июня 2020

Я считаю, что результат, который вы пытаетесь создать, будет следующим:

<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() или, что еще более удобно, вы можете напрямую использовать элемент addnext() метод.

т.е. заменить ref.append(copy) на ref.addnext(copy)

addnext Справочник по API

...