如何处理XML到CSV转换中缺少的元素?

2024-09-27 21:29:28 发布

您现在位置:Python中文网/ 问答频道 /正文

下面XML中的"currentAddress"是可选元素。我的python代码在存在"currentAddress"元素的地方运行良好,如果缺少它,就会出错。你知道吗

XML格式:

<?xml version = '1.0' encoding = 'UTF-8'?>
<ns2:exportEmpData xmlns:ns2="http://webservice.example.com/">
<emplist>
  <empId>6029</empId>
  <fullName>Justin Clark</fullName>
  <currentAddress houseNumber="14" street="Lepanto" city="Barcelona"/>
</emplist>
<emplist>
  <empId>6078</empId>
  <fullName>Jose Domingo</fullName>
</emplist>
</ns2:exportEmpData>

我的Python代码:

import xml
import csv
import xml.etree.ElementTree as ET

tree = ET.parse('C:/emp/emplist.xml')
root = tree.getroot()

# open a file for writing

Emp_data = open('C:/emp/emplist.csv', 'wb')

# create the csv writer object

csvwriter = csv.writer(Emp_data)
emp_head = []

count = 0
for member in root.findall('emplist'):
emp_nodes = []
if count == 0:
    empId = member.find('empId').tag
    emp_head.append(empId)
    fullName = member.find('fullName').tag
    emp_head.append(fullName)
    currentAddress = member.find('currentAddress').tag
    emp_head.append(currentAddress)
    csvwriter.writerow(emp_head)
    count = count + 1

empId = member.find('empId').text
emp_nodes.append(empId)
fullName = member.find('fullName').text
emp_nodes.append(fullName)
currentAddress = member.find('currentAddress').attrib.get('city')
emp_nodes.append(currentAddress)
csvwriter.writerow(emp_nodes)
Emp_data.close()

错误消息:

AttributeError: 'NoneType' object has no attribute 'attrib'

如果"currentAddress"元素对雇员不可用,我想添加一个字符串(例如:"Unknown")。你知道吗


Tags: csv元素countxmlfindheadmembernodes
2条回答

处理的“pythonic”方法是使用try/except,如下所示。这将处理"currentAddress"不存在的情况,以及它不存在但没有city属性的情况。你知道吗

注意,我还删除了for中处理count变量的代码,因为没有必要对第一个变量进行不同的处理。但是有必要,那么处理它的代码也需要做一些类似的事情。你知道吗

import csv
import xml
import xml.etree.ElementTree as ET


xml_filename = 'emplist.xml'
csv_filename = 'emplist.csv'

tree = ET.parse(xml_filename)
root = tree.getroot()

with open(csv_filename, 'w', newline='') as Emp_data:
    csvwriter = csv.writer(Emp_data)

    emp_head = []
    for member in root.findall('emplist'):
        emp_nodes = []

        empId = member.find('empId').text
        emp_nodes.append(empId)
        fullName = member.find('fullName').text
        emp_nodes.append(fullName)

        try:
             currentAddress = member.find('currentAddress').attrib.get('city')
        except AttributeError:
            currentAddress = 'Unknown'

        emp_nodes.append(currentAddress)
        csvwriter.writerow(emp_nodes)

一种方法是首先查看member.find('currentAddress')是否返回None。如果是这样的话,那就让这座城市变得“未知”。如果不是,则使用address_tag.attrib.get('city')提取城市。您还可以检查“city”是否是现有属性之一。你知道吗

from xml.etree import ElementTree

myxml = """<?xml version = '1.0' encoding = 'UTF-8'?>
<ns2:exportEmpData xmlns:ns2="http://webservice.example.com/">
<emplist>
  <empId>6029</empId>
  <fullName>Justin Clark</fullName>
  <currentAddress houseNumber="14" street="Lepanto" city="Barcelona"/>
</emplist>
<emplist>
  <empId>6078</empId>
  <fullName>Jose Domingo</fullName>
</emplist>
</ns2:exportEmpData>
"""

tree = ElementTree.ElementTree(ElementTree.fromstring(myxml))

for member in tree.findall('emplist'):
    city = 'Unknown' # Default value if we don't find a city
    address_tag = member.find('currentAddress')
    if address_tag is not None:
        city = address_tag.attrib.get('city')
    print("City is %s" % city)

相关问题 更多 >

    热门问题