如何使用 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)
我有两个 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)