Python добавляет XML SubElement дважды

1

Я написал код ниже, чтобы добавить XML SubElement, но он добавляет один и тот же код дважды:

Код Python:

from xml.etree import ElementTree as ET
tree = ET.parse("sample.xml")
root = tree.getroot()

child = parent = ''
NOTFOUND = 0
pos = 0

for user in root:
    Id = user.get("id")
    if Id == '012345':
        for attr in user:
            attr_name = attr.get('name')
            pos = len(user)
            if attr_name != "attrib3" and NOTFOUND != 1:
                print "#1: ", user.get('id'), attr.get('name')
                NOTFOUND = NOTFOUND + 1
                parent = user
                child = attr
                continue

if NOTFOUND == 1:
    newattr = ET.SubElement(parent,'res',attrib={'name':'attrib3'})
    newattr_first_seem = ET.SubElement(newattr, 'first_seem', attrib={'date':'2018-08-01', 'status':'GRANTED'})
    print "#2: ", newattr.attrib
    parent.append(newattr)

tree.write('sample.xml')

Желаемый результат:

<stop>
    <user id="012345">
        <res name="attrib1">
            <first_seem date="2018-07-31" status="REQUESTED" />
            <last_seem date="2018-07-31" status="INPROCESS" />
        </res>
        <res name="attrib2">
            <first_seem date="2018-07-31" status="REQUESTED" />
            <last_seem date="2018-07-31" status="COMPLETED" />
        </res>
        **<res name="attrib3">
            <first_seem date="2018-08-01" status="GRANTED" />
        </res>**        
    </user>
    <user id="123456">
        <res name="attrib1">
            <first_seem date="2018-07-31" status="REQUESTED" />
            <last_seem date="2018-07-31" status="REQUESTED" />
        </res>
    </user>
</stop>

Созданный результат:

<stop>
    <user id="012345">
        <res name="attrib1">
            <first_seem date="2018-07-31" status="REQUESTED" />
            <last_seem date="2018-07-31" status="INPROCESS" />
        </res>
        <res name="attrib2">
            <first_seem date="2018-07-31" status="REQUESTED" />
            <last_seem date="2018-07-31" status="COMPLETED" />
        </res>
        **<res name="attrib3">
            <first_seem date="2018-08-01" status="GRANTED" />
        </res>
        <res name="attrib3">
            <first_seem date="2018-08-01" status="GRANTED" />
        </res>**
    </user>
    <user id="123456">
        <res name="attrib1">
            <first_seem date="2018-07-31" status="REQUESTED" />
            <last_seem date="2018-07-31" status="REQUESTED" />
        </res>
    </user>
</stop>

Может ли кто-нибудь помочь мне разобраться, почему новый SubElement записывается дважды? Я помещаю печать и элементы управления математикой в if, чтобы быть уверенным, что она не зацикливается дважды (и это не делает).

  • 0
    Вы уверены, что нового SubElement еще нет во входном XML-файле? Как я вижу в вашем коде, оператор if "if attr_name! =" attrib3 "и NOTFOUND! = 1:" оценивается как True только на первой итерации цикла for, и он даже не проверяет, существует ли attribute3 или нет.
  • 0
    Привет Ai Da, да, я уверен, что attrib3 не находится в исходном файле при первом запуске скрипта, я уверен, и я поставил «если» только для того, чтобы гарантировать, что второе добавление может произойти после первого, когда NOTFOUND будет обновляться с От 0 до 1
Теги:
elementtree

1 ответ

1
Лучший ответ

Используйте ET.dump(newattr)

Пример:

from xml.etree import ElementTree as ET
tree = ET.parse(filename)
root = tree.getroot()

parent = ''
NOTFOUND = False

for user in root:
    Id = user.get("id")
    if Id == '012345':
        if "attrib3" not in [attr.get('name') for attr in user]:  
            print user, "----"          
            NOTFOUND = True
            parent = user

if NOTFOUND:
    newattr = ET.SubElement(parent,'res',attrib={'name':'attrib3'})
    newattr_first_seem = ET.SubElement(newattr, 'first_seem', attrib={'date':'2018-08-01', 'status':'GRANTED'})
    print "#2: ", newattr.attrib
    ET.dump(newattr)    #Update!!!!

tree.write(filename)
  • 0
    Спасибо большое Ракеш :)
  • 0
    Добро пожаловать :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню