2016-09-22 8 views
2

Im는 python과 xml 모두에 새로운 기능을 제공합니다. 주제에 대한 이전 글을 보았으므로 내가 원하는 것을 정확히하는 방법을 알지 못합니다. 그것이 원칙적으로 충분히 단순한 것 같지만.python을 사용하여 XML 파일의 일부분을 구문 분석

<Project> 
<Items> 
    <Item> 
    <Code>A456B</Code> 
    <Database> 
    <Data> 
    <Id>mountain</Id> 
    <Value>12000</Value> 
    </Data> 
    <Data> 
    <Id>UTEM</Id> 
    <Value>53.2</Value> 
    </Data> 
    </Database> 
    </Item> 
    <Item> 
    <Code>A786C</Code> 
    <Database> 
    <Data> 
    <Id>mountain</Id> 
    <Value>5000</Value> 
    </Data> 
    <Data> 
    <Id>UTEM</Id> 
    <Value></Value> 
    </Data> 
    </Database> 
    </Item> 
</Items> 
</Project> 

나는 아무 문제가없는, 코드, 값 및 ID의 전부를 추출하면된다 할 수 있기를 바랍니다.

import xml.etree.cElementTree as ET 

name = 'example tree.xml' 
tree = ET.parse(name) 
root = tree.getroot() 
codes=[] 
ids=[] 
val=[] 
for db in root.iter('Code'): 
    codes.append(db.text) 
for ID in root.iter('Id'): 
    ids.append(ID.text) 
for VALUE in root.iter('Value'): 
    val.append(VALUE.text) 
print codes 
print ids 
print val 

['A456B', 'A786C'] 
['mountain', 'UTEM', 'mountain', 'UTEM'] 
['12000', '53.2', '5000', None] 

어떤 코드와 어떤 ID와 값이 필요한지 알고 싶습니다. 사전의 사전이나 아마도 행 인덱스가 ID 인 DataFrames 목록과 코드 인 열 머리글과 같은 것입니다. 예를 들어

A456B = {산 : 12000, UTEM : 53.2}
A786C = {산 : 5000, UTEM : 없음}

은 결국 내가 방정식을 공급하기 위해 값을 사용하고 싶습니다.

실제 xml 파일에는 각 코드에서 동일한 개수의 Id와 값이 포함되지 않을 수 있습니다. 또한 ID와 값은 코드 섹션마다 다를 수 있습니다./

답변

1

BeautifulSoup은 HTML과 XML을 구문 분석을위한 매우 유용한 모듈입니다 :이 질문은 초등학교, 또는 불분명 한 경우 ... 나는 단지 한 달 동안 파이썬을 해왔

죄송합니다.

from bs4 import BeautifulSoup 
import os 

# read the file into a BeautifulSoup object 
soup = BeautifulSoup(open(os.getcwd() + "\\input.txt")) 

results = {} 

# parse the data, and put it into a dict, where the values are dicts 
for item in soup.findAll('item'): 
    # assemble dicts on the fly using a dict comprehension: 
    # http://stackoverflow.com/a/14507637/4400277 
    results[item.code.text] = {data.id.text:data.value.text for data in item.findAll('data')} 

>>> results 
{u'A786C': {u'mountain': u'5000', u'UTEM': u''}, 
u'A456B': {u'mountain': u'12000', u'UTEM': u'53.2'} 
+0

매우 컴팩트! 내 진짜 XML 파일에서 잘 작동합니다. 타이! – cmj29607

0

이 당신이 원하는 수 있습니다 : 모든 항목 태그를 통해 {'A456B' : {'mountain' : '12000', 'UTEM' : '53.2'}, 'A786C' : {'mountain' : '5000', 'UTEM' : None}}

이 반복을하고, 각 하나를 들어, 딕셔너리에 DICT 키를 가리키는를 작성합니다

import xml.etree.cElementTree as ET 

name = 'test.xml' 
tree = ET.parse(name) 
root = tree.getroot() 
codes={} 

for item in root.iter('Item'): 
    code = item.find('Code').text 
    codes[code] = {} 

    for datum in item.iter('Data'): 
     if datum.find('Value') is not None: 
      value = datum.find('Value').text 
     else: 
      value = None 
     if datum.find('Id') is not None: 
      id = datum.find('Id').text 
      codes[code][id] = value 

print codes 

이 생산 ID와 값의 쌍. ID 태그가 비어 있지 않은 경우에만 ID/데이터 쌍이 작성됩니다.

+0

이 코드는 실제 사례에서 잘 작동하며 읽기 쉽고 이해하기 쉽습니다. – cmj29607

관련 문제