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>
Я заинтересован в информации внутри тега соглашение, которое находится под DATAAREA/LandIndex/LandIndex/
ОБНОВИТЬ:
Благодаря MattDMo эта задача немного сдвинулась с мертвой точки. Поэтому я сделал этот скрипт ниже. Он выполняет итерации файла и получает все экземпляры соглашения детализации и выводит соглашение и тип соглашения для каждого.
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)
Вывод, который я получаю, состоит из нескольких строк: {'accordmentid': '001 4860', 'Agreementtype': 'NATURAL GAS'}
Теперь мне нужно преобразовать этот вывод в формат таблицы (.csv, .dbf, .xls и т. Д.), Чтобы столбцы соглашения и типа соглашения были столбцами:
agreementid | agreementtype
001 4860 | NATURAL GAS
Буду очень признателен, если вы мне поможете, как это сделать. Или, может быть, какой-нибудь пример?
PS Python версия 2.7
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 здесь), чтобы найти первый тег на любом уровне ниже текущего уровня с именем agreementid
, Если в вашем файле есть несколько названных тегов, вы можете использовать root.findall()
и перебрать результаты. Если, например, есть три поля с именем agreementid
и вы знаете, что хотите второй, то root.findall(".//agreementid")[1]
должно сработать.
MattDMo дал достаточный ответ на эту проблему, но я просто хочу напомнить вам, что в python есть модуль csv, который облегчает запись данных, разделенных запятыми, которые обычно затем считываются в приложения, такие как базы данных или электронные таблицы.
Из документов:
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'])