Как добавить вложенные дочерние узлы в родительский узел в документах XML с помощью Python? - PullRequest
2 голосов
/ 01 ноября 2019

У меня есть два снимка XML-файла.

Ввод xml :

input_xml

ТребуетсяВыходной XML :

output_xml

Мне нужно добавить несколько дочерних узлов к родительскому узлу с тегом <triggers\>, используя скрипт Python.

Пример добавляемых дочерних узлов выделен серым цветом в снимке файла output.xml.

Завершить тег для замены triggers узла.

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

Может кто-нибудь помочь мне с сценарием python для замены непустого тега, когда он встречается с тегом выше с использованием сценария python?

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Вы можете использовать ET.SubElement для создания подэлементов для данного узла. Подробнее здесь .

Тогда вы можете установить .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>
0 голосов
/ 01 ноября 2019

Если вы хотите сделать это с 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)
...