0

I am parsing xml file with lxml python 3. converting the elements into dict of list of dict. But code is not working like it should and getting something weird, I tried with debugs and not able to figure out what is the issue:

Below is the snippet i wrote:

    tree = lxml.etree.parse(self.meetingXmlFile)
    root = tree.getroot()

    roomList = []
    for child in root.iter():
        # print("Tag is ::%s  and text is ::%s" % (child.tag ,  child.text))
        if child.tag  == "TowerName":
            roomList.clear()
            indexTower = child.text
            # print(indexTower)
        elif child.tag  == "BigMeetingRooms" :
            roomSize = "bigMeetingRoom"
        elif child.tag == "SmallMeetingRooms":
            roomSize = "smallMeetingRoom"
        elif child.tag  == "MeetingRoomName" :
            roomName = child.text
        elif child.tag == "MeetingRoomMailId" :
            roomMailId = child.text
            roomDict={roomName:roomMailId}
            roomList.append(roomDict)
            if roomSize == "bigMeetingRoom" :
                # print(indexTower, "  ", roomName, "  ", roomMailId)
                self.bigMeetingRoom[indexTower] = roomList
                print(indexTower, "  ", self.bigMeetingRoom[indexTower])
                print(self.bigMeetingRoom)

1 Answer 1

1

Instead of using iter() and testing tag names, consider using xpath() instead...

Python 3.6

from lxml import etree

tree = etree.parse("input.xml")

roomList = {}
for tower in tree.xpath("/root/Towers/Tower"):
    large_rooms = []
    for lr in tower.xpath("MeetingRooms/BigMeetingRooms/MeetingRoom"):
        large_rooms.append({lr.xpath("MeetingRoomName")[0].text: 
                            lr.xpath("MeetingRoomMailId")[0].text})
    roomList[tower.xpath("TowerName")[0].text] = large_rooms

print(roomList)

XML Input ("input.xml")

<root>
    <Towers>
        <Tower>
            <TowerName>Tower 6</TowerName>
            <MeetingRooms>
                <BigMeetingRooms>
                    <MeetingRoom>
                        <MeetingRoomName>Colesseum</MeetingRoomName>
                        <MeetingRoomMailId>Colesseum_mail</MeetingRoomMailId>
                    </MeetingRoom>
                    <MeetingRoom>
                        <MeetingRoomName>Saphire</MeetingRoomName>
                        <MeetingRoomMailId>Saphire_mail</MeetingRoomMailId>
                    </MeetingRoom>
                    <MeetingRoom>
                        <MeetingRoomName>Dafodills</MeetingRoomName>
                        <MeetingRoomMailId>Dafodills_mail</MeetingRoomMailId>
                    </MeetingRoom>
                </BigMeetingRooms>
                <SmallMeetingRooms>
                    <MeetingRoom>
                        <MeetingRoomName>Senate House</MeetingRoomName>
                        <MeetingRoomMailId>SenateHouse_mail</MeetingRoomMailId>
                    </MeetingRoom>
                    <MeetingRoom>
                        <MeetingRoomName>Forum</MeetingRoomName>
                        <MeetingRoomMailId>Forum_mail</MeetingRoomMailId>
                    </MeetingRoom>
                    <MeetingRoom>
                        <MeetingRoomName>Pearl</MeetingRoomName>
                        <MeetingRoomMailId>Pearl_mail</MeetingRoomMailId>
                    </MeetingRoom>
                </SmallMeetingRooms>
            </MeetingRooms>
        </Tower>
        <Tower>
            <TowerName>Tower 7</TowerName>
            <MeetingRooms>
                <BigMeetingRooms>
                    <MeetingRoom>
                        <MeetingRoomName>Colesseum7</MeetingRoomName>
                        <MeetingRoomMailId>Colesseum_mail7</MeetingRoomMailId>
                    </MeetingRoom>
                    <MeetingRoom>
                        <MeetingRoomName>Saphire7</MeetingRoomName>
                        <MeetingRoomMailId>Saphire_mail7</MeetingRoomMailId>
                    </MeetingRoom>
                    <MeetingRoom>
                        <MeetingRoomName>Dafodills7</MeetingRoomName>
                        <MeetingRoomMailId>Dafodills_mail7</MeetingRoomMailId>
                    </MeetingRoom>
                </BigMeetingRooms>
                <SmallMeetingRooms>
                    <MeetingRoom>
                        <MeetingRoomName>Senate House7</MeetingRoomName>
                        <MeetingRoomMailId>SenateHouse_mail7</MeetingRoomMailId>
                    </MeetingRoom>
                    <MeetingRoom>
                        <MeetingRoomName>Forum7</MeetingRoomName>
                        <MeetingRoomMailId>Forum_mail7</MeetingRoomMailId>
                    </MeetingRoom>
                    <MeetingRoom>
                        <MeetingRoomName>Pearl7</MeetingRoomName>
                        <MeetingRoomMailId>Pearl_mail7</MeetingRoomMailId>
                    </MeetingRoom>
                </SmallMeetingRooms>
            </MeetingRooms>
        </Tower>
    </Towers>
</root>

Printed output

{'Tower 6': [{'Colesseum': 'Colesseum_mail'}, {'Saphire': 'Saphire_mail'}, {'Dafodills': 'Dafodills_mail'}], 'Tower 7': [{'Colesseum7': 'Colesseum_mail7'}, {'Saphire7': 'Saphire_mail7'}, {'Dafodills7': 'Dafodills_mail7'}]}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.