#python #xml #insert #parent-child #elementtree
Вопрос:
Я хотел бы добавить несколько полей в каждый узел в нескольких XML-файлах. Однако мой сценарий добавляет ребенка дважды, туда, куда они должны были пойти, и в конце родителя.
Я попытался упростить проблему, вставив поле только в первый узел, и я все еще воспроизводю проблему. Вот программа:
tree = et.parse("testdata.xml")
root = tree.getroot()
firstcountrynode= root.find("country")
newnode = et.SubElement(firstcountrynode,"Capital")
newnode.text = "Vaduz"
firstcountrynode.insert(2,newnode)
tree.write("testresult.xml")
с testdata.xml из примера документов python
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
</data>
И я получаю:
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2008</year>
<Capital>Vaduz</Capital><gdppc>141100</gdppc>
<neighbor name="Austria" direction="E" />
<neighbor name="Switzerland" direction="W" />
<Capital>Vaduz</Capital></country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N" />
</country>
</data>
Любые предложения приветствуются. Спасибо.
Ответ №1:
Ваш код фактически добавляет его дважды:
newnode = et.SubElement(firstcountrynode,"Capital")
firstcountrynode.insert(2,newnode)
Смотрите код ниже, который добавляет его только один раз
import xml.etree.ElementTree as ET
xml = '''<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
</data>'''
root = ET.fromstring(xml)
first_country = root.find('country')
capital = ET.SubElement(first_country,'capital')
capital.text = 'Vaduz'
ET.dump(root)