Python从xml提取数据并将其保存到Excel
问题内容:
我想从XML文件中提取一些数据并将其保存为表格格式,例如XLS或DBF。
这是我拥有的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header />
<SOAP-ENV:Body>
<ADD_LandIndex_001>
<CNTROLAREA>
<BSR>
<VERB>ADD</VERB>
<NOUN>LandIndex</NOUN>
<REVISION>001</REVISION>
</BSR>
</CNTROLAREA>
<DATAAREA>
<LandIndex>
<reportId>AMI100031</reportId>
<requestKey>R3278458</requestKey>
<SubmittedBy>EN4871</SubmittedBy>
<submittedOn>2015/01/06 4:20:11 PM</submittedOn>
<LandIndex>
<agreementdetail>
<agreementid>001 4860</agreementid>
<agreementtype>NATURAL GAS</agreementtype>
<currentstatus>
<status>ACTIVE</status>
<statuseffectivedate>1965/02/18</statuseffectivedate>
<termdate>1965/02/18</termdate>
</currentstatus>
<designatedrepresentative>
</designatedrepresentative>
</agreementdetail>
</LandIndex>
</LandIndex>
</DATAAREA>
</ADD_LandIndex_001>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我感兴趣的内幕信息 agreementdetail 标签,它是下DATAAREA / LandIndex / LandIndex /
更新:
多亏了 MattDMo, 这项任务才从死点开始有所发展。所以我在下面做了这个脚本。迭代文件并获取 Agreementdetail的
所有实例,并为每个实例输出 Agreementid 和 AgreementType 。
import xml.etree.ElementTree as ET
import arcpy
xmlfile = 'D:/Working/Test/Test.xml'
element_tree = ET.parse(xmlfile)
root = element_tree.getroot()
agreement = root.findall(".//agreementdetail")
result = []
elements = ('agreementid', 'agreementtype')
for a in agreement:
obj = {}
for e in elements:
obj[e] = a.find(e).text
result.append(obj)
arcpy.AddMessage(result)
我收到的输出包含以下字符串:{‘agreementid’:‘001 4860’,’agreementtype’:’NATURAL GAS’}
现在,我需要将此输出转换为表格式(.csv,.dbf,.xls等),以便Agreementid和AgreementType为列:
agreementid | agreementtype
001 4860 | NATURAL GAS
如果您能指导我如何实现它,我将非常感谢。还是任何例子?
PS Python版本是2.7
问题答案:
以下应该工作:
import xml.etree.ElementTree as ET
import arcpy
xmlfile = 'D:/Working/Test/Test.xml'
element_tree = ET.parse(xmlfile)
root = element_tree.getroot()
agreement = root.find(".//agreementid").text
arcpy.AddMessage(agreement)
该root.find()
调用使用XPath表达式(此处的快速备忘单在此处的Python文档中)查找名为的当前级别下任意级别的第一个标记agreementid
。如果文件中有多个名为的标记,则可以使用root.findall()
并遍历结果。例如,如果有三个名为的字段agreementid
,并且您知道要第二个字段,则root.findall(".//agreementid")[1]
应该可以使用。