2012-01-12 3 views
1

을 사용하여 xml 태그와 루프 값을 추출한 다음 사전에 저장합니다.XML에서 다른 형식의 데이터를 파이썬으로 사전에로드하기

XML 파일이 포함되어

<root> 
    <tag1>['item1', 'item2']</tag1> 
    <tag2>a normal string</tag2> 
</root> 

파이썬 코드 (약) :

import xml.etree.cElementTree as xml 

xmldata = {} 
xmlfile = xml.parse(XMLFile.xml) 
for xmltag in xmlfile.iter(): 
    xmldata[xmltag.tag] = xmltag.text 

내가 발생했습니다 문제는 xml 파일이 stringlist을 포함 다른 데이터 유형이 포함되어 있다는 것입니다. 불행히도 Element.text은 모든 xml 값을 string (목록 포함)으로 저장합니다. 나는 XML 파일에서로드 할 때

그래서 내가 가진 :

{'tag1':"['item1', 'item2']", 'tag2':'a normal string'} 

내가 선호 줄 때 이렇게하는 쉬운 방법이

{'tag1':['item1', 'item2'], 'tag2':'a normal string'} 

있습니까?
예컨대 원래의 형식으로 사전에 저장하는 명령

아니면이 별도로 Element.text에 대한 대안을 사용하여 문이 값 유형을 결정하는 경우 설정하고 저장해야합니까?

+0

문제를 재현 할 수 있도록 xmldata 값을 포함한 전체 코드 스 니펫을 포함시킬 수 있습니까? –

+0

@DavidRobinson 업데이트했습니다. – user788462

+0

XML에서 문자열이'''로 둘러싸여 있지 않다는 것을 제외하면'eval'을 사용할 수있었습니다. –

답변

1

당신은 복잡한 파이썬 리터럴을 구문 분석하려고 literal_eval 사용할 수 있습니다. 당신의 strigns는 인용 부호가 있기 때문에, 그들은 lteral 평가에서 구문 에러를 제기하지만, 그 주위에 작업을 simle입니다 :

파이썬의 내장 "평가"는 달리
import xml.etree.cElementTree as xml 
from ast import literal_eval 

xmldata = {} 
xmlfile = xml.parse(XMLFile.xml) 
for xmltag in xmlfile.iter(): 
    try: 
     xmldata[xmltag.tag] = literal_eval(xmltag.text) 
    except SyntaxError: 
     xmldata[xmltag.tag] = xmltag.text 

, ast.literal_eval 허용하지 않는 표현의 실행을, 따라서 XML 데이터가 신뢰할 수없는 출처에서 온 경우에도 안전합니다.

+0

고맙습니다. 알아두면 편리합니다. – user788462

1

제안 된 해결책은 다음과 같습니다. [의 존재를 확인한 다음 목록을 구문 분석합니다. 안전 장치가 아닙니다 (분리 기호가 공백이 정확히 ,이 아닌 경우 작동하지 않습니다).하지만 개선하기가 쉽습니다.

import xml.etree.cElementTree as xml 

xmldata = {} 
xmlfile = xml.parse("data.xml") 
for xmltag in xmlfile.iter(): 
    # it's a list 
    if "[" in xmltag.text: 
     d = xmltag.text.lstrip("[").rstrip("]") 
     l = [item.lstrip("'").rstrip("'") for item in d.split(", ")] 
     xmldata[xmltag.tag] = l 
    else: 
     xmldata[xmltag.tag] = xmltag.text 

print xmldata 

인쇄 : {'root': '\n', 'tag1': ['item1', 'item2'], 'tag2': 'a normal string'}

1

당신은 xml을 모든 강력한 힘으로 사용하지 않는다고 생각합니다!

왜 구성하지 마십시오 .xml 같은 :

<root> 
    <tag1> 
     <item>item1</item> 
     <item>item2</item> 
    </tag1> 
    <tag2>a normal string<tag2> 
</root> 

이 방법은 파이썬 코드가 <item>의 컨테이너로 모든 <tag1>을 처리 할 것입니다, 나는 그게 더 나은 것 같아요.

참고 :here도보고 싶을 수도 있습니다. (저자의 "Favorite Way"에 동의 함)

+0

감사합니다 릭, 좋은 트랙에 요소를 사용하여 알고있어 좋은 :) – user788462

관련 문제