Как я могу проверить наличие тегов в XML перед разбором с помощью ElementTree? - PullRequest
0 голосов
/ 17 января 2019

Я относительно новичок в python и в настоящее время пытаюсь разобрать и преобразовать XML в CSV. Мой код работает, если родительский и дочерний теги существуют, но я получаю это сообщение об ошибке:

Phone = element [3] [0] .text IndexError: дочерний индекс вне диапазона

когда тег существует в первом атрибуте, но не во втором атрибуте.

Я пытался вставить заявление if, но оно не совсем сработало. Вот как выглядит xml и мой оригинальный код. Если кто-нибудь может указать мне правильное направление, я был бы признателен!

XML-файл

        <Member>
        <Person>
          <FirstName>JOHN</FirstName>
          <LastName>DOE</LastName>
          <Address>
            <Address1>1234 TEST DR</Address1>
            <Address2></Address2>
            <City>SIMCITY</City>
            <State>TD</State>
            <ZipCode>12345    </ZipCode>
          </Address>
          <Phone>
            <AreaCode>212</AreaCode>
            <PhoneNumber>2223333</PhoneNumber>
          </Phone>
        </Person>
        <Person>
          <FirstName>JANE</FirstName>
          <LastName>DOE</LastName>
          <Address>
            <Address1>1234 DEE ST</Address1>
            <Address2></Address2>
            <City>LCITY</City>
            <State>TD</State>
            <ZipCode>12345    </ZipCode>
          </Address>
        </Person>
        </Member>

Мой код:

        import  csv
        import xml.etree.ElementTree as ET

        tree = ET.parse("Stack.xml")
        root = tree.getroot()

        xml_data_to_csv =open('Out.csv','w')

        Csv_writer=csv.writer(xml_data_to_csv)
        list_head=[]

        count=0
        for element in root.findall('Person'):
            person = []
            address_list = []
            phone_list = []

            #get head node
            if count == 0:
               FirstName = element.find('FirstName').tag
               list_head.append(FirstName)

               LastName = element.find('LastName').tag
               list_head.append(LastName)

               Address = element[2].tag
               list_head.append(Address)

               Phone = element[3].tag
               list_head.append(Phone)

               Csv_writer.writerow(list_head)
               count = count +1

            #get child node
            FirstName = element.find('FirstName').text
            person.append(FirstName)

            LastName = element.find('LastName').text
            person.append(LastName)

            Address = element[2][0].text
            address_list.append(Address)
            Address2 = element[2][1].text
            address_list.append(Address2)
            City = element[2][2].text
            address_list.append(City)
            State = element[2][3].text
            address_list.append(State)
            ZipCode = element[2][4].text
            address_list.append(ZipCode)
            person.append(address_list)

            Phone = element[3][0].text
            phone_list.append(Phone)
            AreaCode = element[3][1].text
            phone_list.append(AreaCode)
            person.append(phone_list)

            #Write List_nodes to csv
            Csv_writer.writerow(person)
        xml_data_to_csv.close()

1 Ответ

0 голосов
/ 17 января 2019

Попробуйте использовать xpath , чтобы найти нужные теги, например, вы можете заменить этот код:

Phone = element[3][0].text
phone_list.append(Phone)
AreaCode = element[3][1].text
phone_list.append(AreaCode)
person.append(phone_list)

как то так:

phone_list = [e.text for e in element.findall('Phone//')]
person.append(phone_list)

или это (на мой взгляд, лучший вариант):

person.append([e.text for e in element.findall('Phone//')])

Таким образом, вы сможете обойти ошибку и значительно сократить объем кода:)

...