2014-07-19 8 views
1

ElementTree를 사용하여 XML 설정 파일에 문제가 있습니다. XML Tree의 어디에 있든 관계없이 요소의 텍스트를 쉽게 찾을 수있는 방법을 원합니다. 설명서에서 말하는대로, findtext()를 사용하여이 작업을 수행 할 수 있어야하지만, 아무리해도 반환 값은 없습니다. 내가 여기서 어디로 잘못 가고 있니? 모든 사람들은 XML이 파이썬에서 다루기가 너무 간단하다는 것을 말하고 있었지만 아직 문제는 없었습니다.Python ElementTree

configFileName = 'file.xml' 

def configSet (x): 
if os.path.exists(configFileName): 
    tree = ET.parse(configFileName) 
    root = tree.getroot() 
    return root.findtext(x) 

hiTemp = configSet('hiTemp') 
print hiTemp 

와 XML

<configData> 
<units> 
    <temp>F</temp> 
</units> 
<pins> 
    <lights>1</lights> 
    <fan>2</fan> 
    <co2>3</co2> 
</pins> 
<events> 
    <airTemps> 
     <hiTemp>80</hiTemp> 
     <lowTemp>72</lowTemp> 
     <hiTempAlarm>84</hiTempAlarm> 
    </airTemps> 
    <CO2> 
     <co2Hi>1500</co2Hi> 
     <co2Low>1400</co2Low> 
     <co2Alarm>600</co2Alarm> 
    </CO2> 
</events> 
<settings> 
    <apikeys> 
     <prowl> 
      <apikey>None</apikey> 
     </prowl> 
    </apikeys> 
</settings> 

예상 된 결과

80 

실제 결과

None 
+0

'os.path.exists (configFileName)'은'False'를 반환 할 수 있습니다. 'else : IOError ("파일을 찾을 수 없습니다.")를 추가하여 그럴 수 있는지 확인하십시오. – jonrsharpe

+0

파일을 찾는 중입니다. 반환 루트를 수행 할 수 있고 부모 요소를 제공하기 때문입니다. – jslay

답변

0

findtext은 전체 경로가 필요하지만 상대 경로를 지정 했으므로 찾고자하는 요소를 찾을 수 없습니다.

당신은

def configSet(x): 
    if os.path.exists(configFileName): 
     tree = ET.parse(configFileName) 
     root = tree.getroot() 
     for e in root.getiterator(): 
      t = e.findtext(x) 
      if t is not None: 
       return t 

업데이트 코드 (1) 좋은 XPath를 제공하거나 수정하실 수 있습니다 : 당신이 목록으로 일치하는 모든 텍스트를 갖고 싶어

를 코드는 조금 다르다.

def configSet(x): 
    matches = [] 
    if os.path.exists(configFileName): 
     tree = ET.parse(configFileName) 
     root = tree.getroot() 
     for e in root.getiterator(): 
      t = e.findtext(x) 
      if t is not None: 
       matches.append(t) 
    return matches 
+0

이것입니다! 최고이지만, root.getiterator가 실제로 무엇을하고 있는지 설명 할 수 있습니까? 재귀 적 유형 검색을 허용하기 위해 getiterator 함수 호출이하는 일은 무엇입니까? – jslay

+0

@ user3724263'getiterator' 함수는 현재 요소를 루트로하는 트리 이터레이터를 생성합니다. 반복자는이 요소와 그 아래의 모든 요소를 ​​문서 (깊이 우선) 순서로 반복합니다. 'e'는 반복 여행의 현재 요소를 나타냅니다. – stanleyxu2005

+0

그래서 기본적으로 e.findtext가 발견 될 때까지 전체 XML을 반복합니다. 또는 전체 XML을 통해서만 반환되는 것만 반환합니다. – jslay

1

xpath를 사용하여 원하는 요소로 이동할 수 있습니다.

return root.find('./events/airTemps/hiTemp').text

documentation here에 따라 쉽게있다.

+0

경로를 모른 채 찾을 수 있습니까? 나는 경로가 변하는 이유가있을 것이라는 것을 매우 의심하지만, 나는 당신이 말할 수 있다고 생각합니다. 예를 들어, 이벤트 airtemps 외부의 설정에서 작동하고 동일한 기능을 사용하는 핀 아래의 조명에 대한 가치를 찾는 방법은 무엇입니까? – jslay

+0

'.//* hiTemp'는 문서에 따라 작동해야합니다 – rinti

+0

@printi'.//* hiTemp'을 시도했습니다. xml에'hiTemp' 전에'ahiTemp'이 있으면, etree는 오류를보고합니다. 'lxml.etree.XMLSyntaxError : 시작과 끝 태그 불일치 : ahiTemp 12 행과 hiTemp 12 행 29 열' – stanleyxu2005

관련 문제