首页 > 解决方案 > 在使用 ElementTree 解析之前,如何检查 XML 中是否存在标签?

问题描述

我对 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()

标签: pythonxmlcsvparsingelementtree

解决方案


尝试使用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//')])

因此,您将能够绕过错误并显着减少代码量:)


推荐阅读