2016-06-20 2 views
1

에 값을 사전에 내가 각 태그의 속성을 가진 XML을 가지고에 다음변환 XML 태그

<?xml version= "1.0" encoding="ISO-8859-1" ?> 
<month xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="my.xsd"> 
    <day Day="2016-1-01"> 
     <hour Hour="00:00"> 
      <Variables> 
       <a>211.3</a> 
       <b>78.94</b> 
       <c>0.6</c> 
      </Variables> 
     </hour> 
     <hour Hour="12:00"> 
      <Variables> 
       <a>155.5</a> 
       <b>85.5</b> 
       <c>0.42</c> 
      </Variables> 
     </hour> 
    </day> 
</month> 

나는 XML을 구문 분석하고 사전에 변환 찾고 있지만 태그, 속성 값.

>>> print d['2016-1-01']['12:00']['b'] 
>>> 85.5 

실제 XML도 더 많은 일 시간이 있습니다

나는 비슷한을 할 수있는 방법을 의미한다. 이것이 가능한가? this answer와 유사한 어떤 기능이 있습니까

# Day 
for child_day in root: 
    print child_day.tag, child_day.attrib 

    # Hour 
    for child_hour in child_day: 
     print '\t', child_hour.tag, child_hour.attrib 

     # Variables 
     for child_Variables in child_hour: 
      print '\t\t', child_Variables.find('b').text 

:

내가 할 수 있었던 것을 그것을 구문 분석 할 수있는 유일한 방법은 이것입니다,하지만 당신은 다른 시간에 여러 가지 변수에 대한보고 싶지 어려운 경우 태그 대신이 속성 케이스와 동일한 속성을 사용합니까?

답변

3

연결된 대답은 dict comprehension이라고하는 것을 사용하고 있습니다. 그것은 매우 간단하고 우아한 솔루션입니다. ElementTree의 각 레벨에서 동일한 작업을 수행하여 dict 레벨을 생성하므로 함수가 반복적으로 자체를 호출 할 수 있습니다.

정확하게 이해한다면 ElementTree의 구조에있는 레벨에 따라 각 태그의 다른 속성을 잡아 dict 키로 사용하면 전환 할 수 있습니다. 최하위 단계에서 태그 이름을 키로 사용하고 텍스트를 값으로 사용하십시오. 그래서 저는 당신이 대답 한 대답만큼 유창한 해결책을 제시 할 수 없었습니다.

우리는 dict comprehension을 사용할 수도 있지만, 적어도 우리가 생각해 낸 해결책은 몇 번 사용해야 할 것입니다.

이 (주어진 샘플 XML)처럼 보이는 dict 얻을 수 있었으면있는 것 같습니다

:

{ 
    "2016-1-01": { 
     "12:00": { 
      "a": "155.5", 
      "b": "85.5", 
      "c": "0.42", 
     }, 
     "00:00": { 
      "a": "211.3", 
      "b": "78.94", 
      "c": "0.6", 
     }, 
    }, 
} 

이 작업을 수행하려면 3 개 기능을해야합니다을; 1을 사용하여 dict (요일, 시간 및 변수)의 각 레벨 생성을 처리합니다.

def month_etree_to_dict(month): 
    d_list = month.getchildren() 
    d_dict = {d.attrib["Day"]: day_etree_to_dict(d) for d in d_list} 
    return d_dict 

def day_etree_to_dict(day): 
    h_list = day.getchildren() 
    h_dict = {h.attrib["Hour"]: hour_etree_to_dict(h) for h in h_list} 
    return h_dict 

def hour_etree_to_dict(hour): 
    v_list = hour.getchildren()[0].getchildren() 
    v_dict = {v.tag: v.text for v in v_list} 
    return v_dict 

기능 month_etree_to_dict은 키가 매일 날짜됩니다 dict를 생성 : 여기에 그들이 어떻게 생겼는지입니다. 값은 day_etree_to_dict 기능을 사용하여 생성 된 사전입니다. day_etree_to_dict 함수는 hour_etree_to_dict 함수를 호출하여 매시간 동일한 작업을 수행합니다. hour_etree_to_dict 기능 때문에이 (가) dict에 대한 키와 그들의 텍스트로 자신의 태그 이름을 사용하여 <Variables>Element 년대 어린이 (<a>, <b><c>)을 반복 할 수있는 ElementTree에 여분의 수준을 뛰어 약간 다르게 작동 값.

이 정보가 의미가있어 유용하다고 생각합니다.

+1

간단히 완벽하게! 나는 너의 설명으로 훨씬 더 나은 사전을 정말로 이해한다. 고맙습니다. – iblasi

+0

문제가 없습니다! 다행스럽게 도울 수있어! – SalmonMode

0

과 같이, DICT XML을 변환 할 때 나는 종종 재귀 defaultdict를 사용

import xml.etree.ElementTree as ET 
from collections import defaultdict 


def Tree(): 
    return defaultdict(Tree) 

tree = ET.parse('x.xml') 
root = tree.getroot() 
d = Tree() 
for day in root.findall('day'): 
    for hour in day.findall('hour'): 
     for v in hour.findall('./Variables/*'): 
      d[day.attrib['Day']][hour.attrib['Hour']][v.tag] = v.text 

print d['2016-1-01']['12:00']['b'] 

참조 :