【问题标题】:Python extract data from xml and save it to excelPython从xml中提取数据并保存到excel
【发布时间】:2015-03-06 23:16:52
【问题描述】:

我想从 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/ 下的 agreementdetail 标签内的信息感兴趣

更新:

感谢 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 等),以便协议 ID 和协议类型为列:

agreementid    | agreementtype 
001       4860 | NATURAL GAS

如果您能指导我如何完成它,我将不胜感激。或者也许有任何例子?

附: Python 版本是 2.7

【问题讨论】:

    标签: python xml python-2.7 arcpy


    【解决方案1】:

    以下应该有效:

    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] 应该可以工作。

    【讨论】:

    • 其实我的目标是获取所有嵌入元素的 的所有证据,因为实际上这个 xml 包含很多 标签,我只是为这篇文章缩短了它。
    • @OlgaK。 SO上有很多关于如何使用csv模块创建和写入CSV文件的帖子,使用各种输入。浏览文档,搜索相关问题,然后自己尝试一些代码。如果您仍有问题,请提出一个新问题。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2021-03-18
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多