如何在Python中将多个XML节点复制到另一个文件

槲寄生

没关系,我是Python的新手。我试图将几个XML节点从sample1.xml复制到out.xml,如果它不存在于sample2.xml中。

这是我被困之前走了多远

import xml.etree.ElementTree as ET

tree = ET.ElementTree(file='sample1.xml')
addtree = ET.ElementTree(file='sample2.xml')

root = tree.getroot()
addroot = addtree.getroot()

for adel in addroot.findall('.//cars/car'):
    for el in root.findall('cars/car'):
        with open('out.xml', 'w+') as f:
            f.write("BEFORE\n")    
            f.write(el.tag)
            f.write("\n")
            f.write(adel.tag)
            f.write("\n")
            f.write("\n")

            f.write("AFTER\n")

            el = adel

            f.write(el.tag)
            f.write("\n")
            f.write(adel.tag)

我不知道我要缺少什么,但这只是复制实际的“ tag”本身。

输出此:

BEFORE
car
car

AFTER
car
car

所以我错过了孩子的节点,也是<></>标签。预期结果如下。

sample1.xml:

<cars>
    <car>
        <use-car>0</use-car>
        <use-gas>0</use-gas>
        <car-name />
        <car-key />
        <car-location>hawaii</car-location>
        <car-port>5</car-port>
    </car>
</cars>

sample2.xml:

<cars>
    <old>
        1
    </old>
    <new>
        8
    </new>
    <car />
</cars>

out.xml中的预期结果(最终产品)

<cars>
    <old>
        1
    </old>
    <new>
        8
    </old>
    <car>
        <use-car>0</use-car>
        <use-gas>0</use-gas>
        <car-name />
        <car-key />
        <car-location>hawaii</car-location>
        <car-port>5</car-port>
    </car>
</cars>

所有其他节点oldnew必须保持不变。我只是想用<car />其所有子代和孙代(如果存在)替换

代恩

首先,您的XML有几个琐碎的问题:

  • sample1:结束cars标记缺少a/
  • sample2:结束new标签错误地读取old,应读取new

其次,免责声明:以下我的解决方案有其局限性-特别是,它不会重复处理将car节点从sample1替换为sample2中的多个位置但这对于您提供的示例文件来说效果很好。

第三:由于对访问ElementTree节点父节点有最重要的回答-他们为get_node_parent_info下面的实现提供了信息

最后,代码:

import xml.etree.ElementTree as ET

def find_child(node, with_name):
    """Recursively find node with given name"""
    for element in list(node):
        if element.tag == with_name:
            return element
        elif list(element):
            sub_result = find_child(element, with_name)
            if sub_result is not None:
                return sub_result
    return None

def replace_node(from_tree, to_tree, node_name):
    """
    Replace node with given node_name in to_tree with
    the same-named node from the from_tree
    """
    # Find nodes of given name ('car' in the example) in each tree
    from_node = find_child(from_tree.getroot(), node_name)
    to_node = find_child(to_tree.getroot(), node_name)

    # Find where to substitute the from_node into the to_tree
    to_parent, to_index = get_node_parent_info(to_tree, to_node)

    # Replace to_node with from_node
    to_parent.remove(to_node)
    to_parent.insert(to_index, from_node)

def get_node_parent_info(tree, node):
    """
    Return tuple of (parent, index) where:
        parent = node's parent within tree
        index = index of node under parent
    """
    parent_map = {c:p for p in tree.iter() for c in p}
    parent = parent_map[node]
    return parent, list(parent).index(node)

from_tree = ET.ElementTree(file='sample1.xml')
to_tree = ET.ElementTree(file='sample2.xml')

replace_node(from_tree, to_tree, 'car')

# ET.dump(to_tree)
to_tree.write('output.xml')

更新:最近引起我注意的是,find_child()如果所讨论的“子级”不在所遍历的XML树的第一个分支中,则我最初提供的解决方案的实现将失败。我已经更新了上面的实现以纠正此问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Python中将多个XML节点复制到另一个文件

来自分类Dev

如何在Java中将文件属性从一个文件复制到另一个文件?

来自分类Dev

在python中将一个文件的内容复制到另一个

来自分类Dev

如何将子节点结构从一个XML文件复制到另一个XML文件(合并两个XML文件)?

来自分类Dev

如何在Flutter中将列表值复制到另一个列表

来自分类Dev

如何使用Nokogiri将节点从一个xml文件复制到另一个xml文件?

来自分类Dev

在Python中将“ N”行从一个文件复制到另一个文件?

来自分类Dev

在python中将行从一个文件复制到另一个文件

来自分类Dev

如何在MATLAB中将单元格从一个Excel文件复制到另一个Excel文件

来自分类Dev

如何在MATLAB中将单元格从一个Excel文件复制到另一个Excel文件

来自分类Dev

如何在openpyxl中将图像从一个Excel复制到另一个?

来自分类Dev

如何在javascript中将一个类的属性复制到另一个类,包括方法

来自分类Dev

如何在C ++中将指向一个类的指针复制到另一个类中?

来自分类Dev

如何在openpyxl中将图像从一个Excel复制到另一个?

来自分类Dev

如何在 Git 中将一个分支复制到另一个分支

来自分类Dev

如何在 ASP.NET 中将一个图像复制到另一个图像?

来自分类Dev

如何在bash脚本中将所有文件从一个目录复制到另一个目录

来自分类Dev

如何在Linux中将具有特定扩展名的文件从一个目录复制到另一个目录

来自分类Dev

如何在指定位置使用 xsl 将数据从 xml 文件复制到另一个 xml 文件

来自分类Dev

如何在LINQ中将对象的所有属性复制到另一个

来自分类Dev

php-如何在PHP Laravel Excel中将工作表复制到另一个?

来自分类Dev

如何在LINQ中将对象的所有属性复制到另一个

来自分类Dev

在Linux中将文件从用户复制到另一个

来自分类Dev

如何从一个文件复制到另一个?

来自分类Dev

如何将多个文件夹复制到另一个文件夹?

来自分类Dev

如何使用python在Elasticsearch中将索引修改后的内容复制到另一个内容

来自分类Dev

在cpp中将单词从一个文件复制到另一个文件

来自分类Dev

在cpp中将单词从一个文件复制到另一个文件

来自分类Dev

将文件从多个目录复制到另一个目录

Related 相关文章

  1. 1

    如何在Python中将多个XML节点复制到另一个文件

  2. 2

    如何在Java中将文件属性从一个文件复制到另一个文件?

  3. 3

    在python中将一个文件的内容复制到另一个

  4. 4

    如何将子节点结构从一个XML文件复制到另一个XML文件(合并两个XML文件)?

  5. 5

    如何在Flutter中将列表值复制到另一个列表

  6. 6

    如何使用Nokogiri将节点从一个xml文件复制到另一个xml文件?

  7. 7

    在Python中将“ N”行从一个文件复制到另一个文件?

  8. 8

    在python中将行从一个文件复制到另一个文件

  9. 9

    如何在MATLAB中将单元格从一个Excel文件复制到另一个Excel文件

  10. 10

    如何在MATLAB中将单元格从一个Excel文件复制到另一个Excel文件

  11. 11

    如何在openpyxl中将图像从一个Excel复制到另一个?

  12. 12

    如何在javascript中将一个类的属性复制到另一个类,包括方法

  13. 13

    如何在C ++中将指向一个类的指针复制到另一个类中?

  14. 14

    如何在openpyxl中将图像从一个Excel复制到另一个?

  15. 15

    如何在 Git 中将一个分支复制到另一个分支

  16. 16

    如何在 ASP.NET 中将一个图像复制到另一个图像?

  17. 17

    如何在bash脚本中将所有文件从一个目录复制到另一个目录

  18. 18

    如何在Linux中将具有特定扩展名的文件从一个目录复制到另一个目录

  19. 19

    如何在指定位置使用 xsl 将数据从 xml 文件复制到另一个 xml 文件

  20. 20

    如何在LINQ中将对象的所有属性复制到另一个

  21. 21

    php-如何在PHP Laravel Excel中将工作表复制到另一个?

  22. 22

    如何在LINQ中将对象的所有属性复制到另一个

  23. 23

    在Linux中将文件从用户复制到另一个

  24. 24

    如何从一个文件复制到另一个?

  25. 25

    如何将多个文件夹复制到另一个文件夹?

  26. 26

    如何使用python在Elasticsearch中将索引修改后的内容复制到另一个内容

  27. 27

    在cpp中将单词从一个文件复制到另一个文件

  28. 28

    在cpp中将单词从一个文件复制到另一个文件

  29. 29

    将文件从多个目录复制到另一个目录

热门标签

归档