使用ElementTree(Python)将父标记添加到嵌套结构

时间:2015-03-18 18:25:55

标签: python xml elementtree

I have the following structure

<root>
  <data>
     <config>
        CONFIGURATION
     <config>
  </data>

</root>

使用Python的ElementTree模块,我想将一个父元素添加到<config>标记为

<root>
  <data>
    <type>
      <config>
        CONFIGURATION
      <config>
    </type>
  </data>

</root>

此外,xml文件可能在其他位置有其他配置标记,但我只对出现在数据标记下的那些感兴趣。

1 个答案:

答案 0 :(得分:1)

这归结为~3步:

  1. 获取符合条件的元素(tag == x,parent tag == y)
  2. 从父级删除该元素,将新子级放在该位置
  3. 将前一个孩子添加到新孩子身上。
  4. 第一步,我们可以使用this answer。由于我们知道我们以后需要父母,所以我们也要在搜索中保留它。

    def find_elements(tree, child_tag, parent_tag):
        parent_map = dict((c, p) for p in tree.iter() for c in p)
        for el in tree.iter(child_tag):
            parent = parent_map[el]
            if parent.tag == parent_tag:
                yield el, parent
    

    第二步和第三步非常相关,我们可以一起完成。

    def insert_new_els(tree, child_tag, parent_tag, new_node_tag):
        to_replace = list(find_elements(tree, child_tag, parent_tag))
        for child, parent in to_replace:
            ix = list(parent).index(child)
            new_node = ET.Element(new_node_tag)
            parent.insert(ix, new_node)
            parent.remove(child)
            new_node.append(child)
    

    您的树将被修改到位。 现在用法很简单:

    tree = ET.parse('some_file.xml')
    insert_new_els(tree, 'config', 'data', 'type')
    tree.write('some_file_processed.xml')
    

    未测试