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

时间:2019-11-01 10:12:37

标签: python python-3.x xml xml-parsing elementtree

我有两个xml文件快照。

输入xml

input_xml

所需的输出XML

output_xml

我需要使用python脚本在标签为<triggers\>的父节点上添加几个子节点。

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

完成标记以替换triggers节点。

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

有人在使用python脚本遇到上述标记时,有人可以用python脚本帮助我替换非空标记吗?

2 个答案:

答案 0 :(得分:1)

您可以使用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>

答案 1 :(得分:0)

如果要使用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)