вставка дерева элементов python добавляет дочерние элементы дважды в требуемой позиции и в конце

#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:

Ваш код фактически добавляет его дважды:

  1. newnode = et.SubElement(firstcountrynode,"Capital")
  2. 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)