Python 从 xml 中提取数据并将其保存到 excel
Python extract data from xml and save it to excel
我想从 XML 文件中提取一些数据并将其保存为 table 格式,例如 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'}
现在我需要将此输出转换为 table 格式(.csv、.dbf、.xls 等),以便 agreementid 和 agreementtype 为列:
agreementid | agreementtype
001 4860 | NATURAL GAS
如果您能指导我如何完成它,我将不胜感激。或者有什么例子吗?
P.S。 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 expression (quick cheatsheet is in the Python docs here) 查找当前级别 agreementid
下任意级别的第一个标签。如果您的文件中有多个以该名称命名的标签,您可以使用 root.findall()
并遍历结果。例如,如果有三个名为 agreementid
的字段,并且您知道您想要第二个,那么 root.findall(".//agreementid")[1]
应该可以。
MattDMo 已经给出了足够的问题答案,但我只是想提醒你 python 有一个 csv module 可以更容易地编写逗号分隔的数据,通常然后读取进入数据库或电子表格等应用程序。
来自文档:
import csv
with open('eggs.csv', 'wb') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=' ',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
我想从 XML 文件中提取一些数据并将其保存为 table 格式,例如 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'}
现在我需要将此输出转换为 table 格式(.csv、.dbf、.xls 等),以便 agreementid 和 agreementtype 为列:
agreementid | agreementtype
001 4860 | NATURAL GAS
如果您能指导我如何完成它,我将不胜感激。或者有什么例子吗?
P.S。 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 expression (quick cheatsheet is in the Python docs here) 查找当前级别 agreementid
下任意级别的第一个标签。如果您的文件中有多个以该名称命名的标签,您可以使用 root.findall()
并遍历结果。例如,如果有三个名为 agreementid
的字段,并且您知道您想要第二个,那么 root.findall(".//agreementid")[1]
应该可以。
MattDMo 已经给出了足够的问题答案,但我只是想提醒你 python 有一个 csv module 可以更容易地编写逗号分隔的数据,通常然后读取进入数据库或电子表格等应用程序。
来自文档:
import csv
with open('eggs.csv', 'wb') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=' ',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])