我正在尝试获取API调用响应并将XML数据解析为列表。我在多重儿童/父母关系中挣扎。我希望导出一个新的XML文件,该文件将排列每个作业ID和跟踪编号,然后将其导入excel。这是我到目前为止的内容。
源XML文件如下所示:
<project>
<name>October 2019</name>
<jobs>
<job>
<id>5654206</id>
<tracking>
<mailPiece>
<barCode>00270200802095682022</barCode>
<address>Accounts Payable,1661 Knott Ave,La Mirada,CA,90638</address>
<status>En Route</status>
<dateTime>2019-10-12 00:04:21.0</dateTime>
<statusLocation>PONTIAC,MI</statusLocation>
</mailPiece>
</tracking>...
代码:
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element, SubElement
tree = ET.parse('mailings.xml')
root = tree.getroot()
print(root.tag)
for x in root[1].findall('job'):
id=x.find('id').text
tracking=x.find('tracking').text
print(root[1].tag,id,tracking)
该脚本当前返回以下内容:
jobs 5654206 None
jobs 5654203 None
我在多重儿童/父母关系中挣扎。
自行解决此问题的正确方法是使用调试器。例如,使用VS Code,在应用断点并使用调试器运行脚本之后,它将在断点处停止,我可以检查内存中的所有变量,并像在脚本中一样在调试控制台上运行命令。变量窗口输出如下所示:
[有多种方法可以在命令行上执行,也可以使用像iPython这样的REPL等,但是我发现在像[[VS Code或PyCharm要走的路。他们的调试器无需在任何地方添加print语句来测试代码,重写代码以暴露更多必须打印到控制台的变量,等等。
调试器使您可以在代码执行中的任何时候,将所有变量视为快照,完全像Python解释器看到它们一样。您可以:find
方法的子层次结构x.find('tracking')
时,它将直接找到mailPiece
节点。如果打印tag
属性而不是text
属性,您会看到它是'mailPiece'
(请参见上面的调试窗口)。因此,解决问题的一种方法是将每个mailPiece元素存储为变量,然后使用查找从中提取所需的各个属性(即条形码,地址等)。
这里有一些代码将所有这些都拉入列表和字典的组合层次结构中,然后可以用来构建Excel输出。
注:
执行此操作的最有效方法是在读取xml时逐行进行,但这对于可读性,可维护性以及是否需要进行任何需要了解以下方面知识的后期处理来说都更好。一次有多个节点。import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element, SubElement
from types import SimpleNamespace
tree = ET.parse('mailings.xml')
root = tree.getroot()
jobs = []
for job in root[1].findall('job'):
jobdict = {}
jobdict['id'] = job.find('id').text
jobdict['trackingMailPieces'] = []
for tracking in job.find('tracking'):
if tracking.tag == 'mailPiece':
mailPieceDict = {}
mailPieceDict['barCode'] = tracking.find('barCode').text
mailPieceDict['address'] = tracking.find('address').text
mailPieceDict['status'] = tracking.find('status').text
mailPieceDict['dateTime'] = tracking.find('dateTime').text
mailPieceDict['statusLocation'] = tracking.find('statusLocation').text
jobdict['trackingMailPieces'].append(mailPieceDict)
jobs.append(jobdict)
for job in jobs:
print('Job ID: {}'.format(job['id']))
for mp in job['trackingMailPieces']:
print(' mailPiece:')
for key, value in mp.items():
print(' {} = {}'.format(key, value))
结果是:
Job ID: 5654206
mailPiece:
barCode = 00270200802095682022
address = Accounts Payable,1661 Knott Ave,La Mirada,CA,90638
status = En Route
dateTime = 2019-10-12 00:04:21.0
statusLocation = PONTIAC,MI
输出?
例如,无需创建中间格式,然后将其导入Excel后就需要进行操作。