Если мы просто сосредоточимся на обновлении XML, то я бы передал дерево в качестве аргумента и передал dict, содержащий другие значения.
Вы можете использовать эти значения в предикатах xpath, чтобы сузить элемент, который вы хотите обновить.Это должно быть намного проще, чем использование циклов for для проверки значений элементов.
Пример ...
Параметры из вопроса (для соответствия tower one
на Tower one
XML)
Например, для TowerName = Tower one, meetingRoomName = ABC и MeetingRoomTimeStamp = "2018-05-31 00:45:00", мне нужно обновить значение isMeetingRoomAvailable до 1.
Ввод XML (test.xml) (изменен, чтобы быть меньше, чем оригинал)
<root>
<Towers>
<Tower>
<TowerName>Tower one</TowerName>
<MeetingRooms>
<BigMeetingRooms>
<MeetingRoom>
<MeetingRoomName>ABC</MeetingRoomName>
<MeetingRoomMailId>mail_id_ABC</MeetingRoomMailId>
<MeetingRoomAvailabilityInfo>
<MeetingRoomTimeStamp>2018-05-31 00:00:00</MeetingRoomTimeStamp>
<isMeetingRoomAvailable>0</isMeetingRoomAvailable>
</MeetingRoomAvailabilityInfo>
<MeetingRoomAvailabilityInfo>
<MeetingRoomTimeStamp>2018-05-31 00:45:00</MeetingRoomTimeStamp>
<isMeetingRoomAvailable>0</isMeetingRoomAvailable>
</MeetingRoomAvailabilityInfo>
<MeetingRoomAvailabilityInfo>
<MeetingRoomTimeStamp>2018-05-31 01:00:00</MeetingRoomTimeStamp>
<isMeetingRoomAvailable>0</isMeetingRoomAvailable>
</MeetingRoomAvailabilityInfo>
</MeetingRoom>
<MeetingRoom>
<MeetingRoomName>JKL</MeetingRoomName>
<MeetingRoomMailId>mail_id_JKL</MeetingRoomMailId>
<MeetingRoomAvailabilityInfo>
<MeetingRoomTimeStamp>2018-05-31 00:00:00</MeetingRoomTimeStamp>
<isMeetingRoomAvailable>0</isMeetingRoomAvailable>
</MeetingRoomAvailabilityInfo>
</MeetingRoom>
</BigMeetingRooms>
<SmallMeetingRooms>
<MeetingRoom>
<MeetingRoomName>XYZ</MeetingRoomName>
<MeetingRoomMailId>mail_id_XYZ</MeetingRoomMailId>
<MeetingRoomAvailabilityInfo>
<MeetingRoomTimeStamp>2018-05-31 00:00:00</MeetingRoomTimeStamp>
<isMeetingRoomAvailable>0</isMeetingRoomAvailable>
</MeetingRoomAvailabilityInfo>
</MeetingRoom>
</SmallMeetingRooms>
</MeetingRooms>
</Tower>
</Towers>
</root>
Python 3,6
from lxml import etree
import sys
tower_name = "Tower one"
meeting_room = "ABC"
timestamp = "2018-05-31 00:45:00"
def update_xml(to_update, params):
try:
node = to_update.xpath("/root/Towers/Tower[TowerName='{}']/MeetingRooms/*/"
"MeetingRoom[MeetingRoomName='{}']/"
"MeetingRoomAvailabilityInfo[MeetingRoomTimeStamp='{}']/isMeetingRoomAvailable"
.format(params.get("TowerName"), params.get("MeetingRoom"), params.get("timestamp")))[0]
except IndexError:
sys.exit("cant find the xpath to update")
else:
node.text = "1"
tree = etree.parse("test.xml")
update_xml(tree, {"TowerName": tower_name, "MeetingRoom": meeting_room, "timestamp": timestamp})
print(etree.tostring(tree, encoding="unicode", pretty_print=True))
Вывод (из печати)
<root>
<Towers>
<Tower>
<TowerName>Tower one</TowerName>
<MeetingRooms>
<BigMeetingRooms>
<MeetingRoom>
<MeetingRoomName>ABC</MeetingRoomName>
<MeetingRoomMailId>mail_id_ABC</MeetingRoomMailId>
<MeetingRoomAvailabilityInfo>
<MeetingRoomTimeStamp>2018-05-31 00:00:00</MeetingRoomTimeStamp>
<isMeetingRoomAvailable>0</isMeetingRoomAvailable>
</MeetingRoomAvailabilityInfo>
<MeetingRoomAvailabilityInfo>
<MeetingRoomTimeStamp>2018-05-31 00:45:00</MeetingRoomTimeStamp>
<isMeetingRoomAvailable>1</isMeetingRoomAvailable>
</MeetingRoomAvailabilityInfo>
<MeetingRoomAvailabilityInfo>
<MeetingRoomTimeStamp>2018-05-31 01:00:00</MeetingRoomTimeStamp>
<isMeetingRoomAvailable>0</isMeetingRoomAvailable>
</MeetingRoomAvailabilityInfo>
</MeetingRoom>
<MeetingRoom>
<MeetingRoomName>JKL</MeetingRoomName>
<MeetingRoomMailId>mail_id_JKL</MeetingRoomMailId>
<MeetingRoomAvailabilityInfo>
<MeetingRoomTimeStamp>2018-05-31 00:00:00</MeetingRoomTimeStamp>
<isMeetingRoomAvailable>0</isMeetingRoomAvailable>
</MeetingRoomAvailabilityInfo>
</MeetingRoom>
</BigMeetingRooms>
<SmallMeetingRooms>
<MeetingRoom>
<MeetingRoomName>XYZ</MeetingRoomName>
<MeetingRoomMailId>mail_id_XYZ</MeetingRoomMailId>
<MeetingRoomAvailabilityInfo>
<MeetingRoomTimeStamp>2018-05-31 00:00:00</MeetingRoomTimeStamp>
<isMeetingRoomAvailable>0</isMeetingRoomAvailable>
</MeetingRoomAvailabilityInfo>
</MeetingRoom>
</SmallMeetingRooms>
</MeetingRooms>
</Tower>
</Towers>
</root>