【问题标题】:How can I append XML parent tags to child tags?如何将 XML 父标签附加到子标签?
【发布时间】:2021-09-12 18:28:00
【问题描述】:

我有一个示例 XML 文件:

<Root>
 <Parent_1>
  <Child_1> Text 1 </Child_1>
  <Child_2> Text 2 </Child_2>
 </Parent_1>
 <Parent_2>
  <Child_3> Text 3 </Child_3>
  <Child_4> Text 4 </Child_4>
 </Parent_2>

我想将父标签附加到层次结构中。

<Root>
 <Root_Parent_1>
  <Root_Parent_1_Child_1> Text 1 </Root_Parent_1_Child_1>
  <Root_Parent_1_Child_2> Text 2 </Root_Parent_1_Child_2>
 </Root_Parent_1>
 <Root_Parent_2>
  <Root_Parent_2_Child_3> Text 3 </Root_Parent_2_Child_3>
  <Root_Parent_2_Child_4> Text 4 </Root_Parent_2_Child_4>
 </Root_Parent_2>
</Root>

有人可以帮我尝试阅读文件并附加标签吗?

【问题讨论】:

标签: python python-3.x xml append parent-child


【解决方案1】:

基本上你只想编写一个 XML 树的遍历,在你前进的过程中在目标树中创建新元素,并累积你想要添加到标签的前缀。

下面的handle_node函数在遍历中处理一个节点,并返回它创建的目标元素(假设你的文件是toto.xml):

import lxml.etree as et

def handle_node(nd, prefix):
    new_prefix = f'{prefix}_{nd.tag}' if prefix != '' else nd.tag
    elem = et.Element(new_prefix)
    if len(nd) == 0:
        elem.text = nd.text
        return elem
    for k in nd:
        elem.append(handle_node(k, new_prefix))
    return elem
        
root = et.parse('toto.xml').getroot()
target = handle_node(root, '')

您可以打印出target XML 树来检查结果是否符合您的预期:

print(et.tostring(target, pretty_print=True).decode())

【讨论】:

    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    相关资源
    最近更新 更多