Python从xml中提取数据并保存到ex

2024-04-26 23:00:27 发布

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

我想从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>

我对DATAAREA/LandIndex/LandIndex/

更新:

多亏了MattDMo这项任务已经有点偏离了它的死点。所以我在下面写了这个剧本。它迭代文件并获取agreementdetail的所有实例,并为每个实例输出agreementidagreementtype

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

如果你能指导我如何完成它,我将非常感激。或者举个例子?

p.S.Python版本是2.7


Tags: 文件envaddobjxmlresultnaturalsoap
2条回答

以下方法应该有效:

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文档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'])

相关问题 更多 >