代码之家  ›  专栏  ›  技术社区  ›  Codr4Life

在使用elementtree解析之前,如何检查XML中是否存在标记?

  •  0
  • Codr4Life  · 技术社区  · 7 年前

    我对python比较陌生,目前正在尝试解析XML并将其转换为csv。如果父标记和子标记存在,则我的代码有效,但我收到以下错误消息:

    phone=元素[3][0].文本 索引错误:子索引超出范围

    当标记存在于第一个属性中而不是第二个属性中时。

    我试着写一个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 回复  |  直到 7 年前
        1
  •  0
  •   Andrey Kostrenko    7 年前

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

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