如何使用 python 将嵌套子节点添加到 xml 文档中的父节点?

How to add nested child nodes to a parent node in xml documents using python?

我有两个 xml 文件快照。

输入xml:

期望输出XML:

我需要使用 python 脚本将几个子节点添加到带有标签 <triggers\> 的父节点。

要添加的子节点示例在 output.xml 快照中以灰色突出显示。

替换 triggers 节点的完整标记。

  <triggers>
    <hudson.triggers.TimerTrigger>
      <spec>1 1 1 1 1</spec>
    </hudson.triggers.TimerTrigger>
  </triggers>

任何人都可以帮助我使用 python 脚本来替换非空标签,只要遇到上述标签使用 python 脚本吗?

您可以使用 ET.SubElement 为给定节点创建子元素。更多信息 here.

然后你可以设置.text为该节点的值。

例如,考虑以下输入 xml 文档:

<root>
  <triggers/>
  <triggers/>
</root>

试试这个:

import xml.etree.ElementTree as ET

tree = ET.parse('input.xml')
root = tree.getroot()

#Get all triggers elements
trigger_elements = root.findall('./triggers')

#For each trigger element in your xml document
for trigger in trigger_elements:

    #Make subelement to the initial trigger element
    time_trigger_element = ET.SubElement(trigger, 'hudson.triggers.TimerTrigger')

    #Make subelement to the time trigger elemenent with name 'spec'
    spec_element = ET.SubElement(time_trigger_element, 'spec')

    #Set the text of spec element to 1 1 1 1 1
    spec_element.text = ' '.join(['1']*5)


#Save the xml tree to a file
tree.write("output.xml")

输出:

<root>
  <triggers><hudson.triggers.TimerTrigger><spec>1 1 1 1 1</spec></hudson.triggers.TimerTrigger></triggers>
  <triggers><hudson.triggers.TimerTrigger><spec>1 1 1 1 1</spec></hudson.triggers.TimerTrigger></triggers>
</root>

如果你想用 BeautifulSoup 来做,你可以尝试这样的事情:

code1 = """   
<triggers/>
"""
code2 = """    
<triggers>
    <hudson.triggers.TimerTrigger>
      <spec>1 1 1 1 1</spec>
    </hudson.triggers.TimerTrigger>
  </triggers>

"""
from bs4 import BeautifulSoup as bs

soup1 = bs(code1)
soup2 = bs(code2)

old = soup1.find('triggers')
new = soup2.find('triggers')
old.replaceWith(new)
print(soup1)