2015-01-08 3 views
1

XML 파일에서 일부 데이터를 추출하여 XLS 또는 DBF와 같은 테이블 형식으로 저장하고 싶습니다. 여기 Python이 XML에서 데이터를 추출하여 Excel에 저장

이 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/

UPDATE 아래에있는 agreementdetail 태그 내부 정보에 관심이 :

덕분에 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) 

내가 수신하고 출력이 문자열의 무리로 구성 { 'agreementid': '001 4860', 'agreementtype': '천연 가스'}

지금 내가이 출력을 변환 할 필요를 당신이 그것을 수행하는 방법에 나를 인도 할 수 있다면

agreementid | agreementtype 
001  4860 | NATURAL GAS 

나는 매우 감사하게 될 것입니다 : 테이블 형식 (.XLS 등 .CSV, .DBF) 때문에에 그 agreementid 및 agreementtype는 열입니다. 아니면 어떤 예입니까?

P.

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 표현이라는 현재 수준 아래의 모든 수준에서 첫 번째 태그를 찾으려면 (빠른 쪽지가 파이썬 문서 here에) : 파이썬 버전은 2.7

답변

1

다음은 작동합니다입니다 agreementid. 파일에 여러 태그가있는 경우 root.findall()을 사용하여 결과를 반복 할 수 있습니다. 예를 들어, agreementid이라는 세 개의 필드가 있고 두 번째 필드를 원할 경우, root.findall(".//agreementid")[1]이 작동해야합니다.

+0

감사합니다! 그것은 작동합니다! –

+0

실제로이 xml에 많은 태그가 포함되어 있기 때문에 실제로 의 모든 증거를 모든 임베디드 요소와 함께 얻는 것이 내 목표입니다. 방금이 게시물의 길이를 단축했습니다. –

+1

@OlgaK. 다양한 입력을 사용하여 ['csv'] (https://docs.python.org/2/library/csv.html) 모듈을 사용하여 CSV 파일을 만들고 쓰는 방법에 대한 많은 게시물이 있습니다. 문서를 탐색하고 관련 질문을 위해 SO를 검색 한 다음 직접 코드를 시험해보십시오. 그래도 문제가 해결되지 않으면 새로운 질문을하십시오. – MattDMo

1

MattDMo는 문제에 대한 충분한 답을주었습니다. 그러나 파이썬에는 쉼표로 구분 된 데이터를 쉽게 쓸 수있는 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'])