2012-04-11 4 views
1

XML 문서를 Python 데이터 구조로 변환하려고합니다.Python : dict 키가 덮어 쓰는 것을 방지합니다.

는 XML의 샘플 :

<SOFTWARES> 
     <PUBLISHER>Microsoft Corporation</PUBLISHER> 
     <NAME>Microsoft Office Visio 2010</NAME> 
     <VERSION>14.0.6029.1000</VERSION> 
     <FOLDER>C:/Program Files/Microsoft Office/</FOLDER> 
     <LANGUAGE>Language Neutral</LANGUAGE> 
     <INSTALLDATE>2012/03/29</INSTALLDATE> 
    </SOFTWARES> 
    <SOFTWARES> 
     <PUBLISHER>Microsoft</PUBLISHER> 
     <NAME>Update for Microsoft Office 2010 (KB2553310) 64-Bit Edition</NAME> 
     <INSTALLDATE>0000//0/0/00</INSTALLDATE> 
    </SOFTWARES> 

lxml.de이 탁월한 예를 가지고 http://lxml.de/FAQ.html#how-can-i-map-an-xml-tree-into-a-dict-of-dicts

def xml_to_dict(element): 
    return element.tag, dict(map(xml_to_dict, element)) or element.text 

이 좋은 갖는다 dicts의 딕셔너리 그러나 하나의 결함을 생성한다. 기존 키보다 우선합니다. 하여 프로세스가 완료되면 그래서 내가 얻을 :에 관계없이 전에 얼마나 많은, 마지막 소프트웨어 블록이다

'SOFTWARES': { 
    'PUBLISHER': 'Microsoft', 
    'NAME': 'Update for Microsoft Office 2010 (KB2553310) 64-Bit Edition', 
    'INSTALLDATE': '0000//0/0/00', 
}, 

합니다. lxml의 함수는 재귀 적이기 때문에 잘 작동하지만 중복 키를 처리 할 수있는 무언가를 작성하려고합니다. 가급적이면 목록에있는 SOFTWARES dicts를 그냥 던져서 시간이되면 목록을 반복 할 수 있습니다. 이 특정한 경우에

답변

1

가장 쉬운 해결책은 :

map(xml_to_dict, xml_document) 

이렇게하면 사전의 목록을 제공합니다.

+0

가능하면 dicts를 유지하고 싶습니다. 중복 키가있는 딕트를 목록에 추가하기 만하면됩니다. –

+1

@PhilipCammarata : 이것은 당신에게 아주 이상한 형식을 줄 것입니다. 값이 목록인지 여부는 알 수 없으므로 모든 코드에 특별한 경우가 필요합니다. 항상 목록을 사용하거나 사용하지 마십시오. –

+1

샘플 입력은 반복 키가없는 SOFTWARES 블록 목록과 비슷합니다. 이를위한 자연스러운 데이터 모델은 dicts 목록 (SOFTWARE 블록 당 하나의 dict)입니다. 이것은 @ Sven의 코드가하는 것과 정확히 같습니다. – alexis

관련 문제