2017-11-10 3 views
0

외부 도메인에서 XML 파일을 읽어야합니다. 내 코드 :xml을 구문 분석 할 파이썬 기능 조정

tree = ET.ElementTree(file=urllib2.urlopen('http://192.168.2.57:8010/data/camera_state.xml')) 
root = tree.getroot() 
root.tag, root.attrib 

for elem in tree.iter(): 
    print elem.tag, elem.att 

는 내가 필요로하는 구조로 얻을 수 없었다, 내 함수의 결과는 다음과 같습니다 :

CameraState {} 
Cameras {} 
Camera {'Id': '1'} 
State {} 
Camera {'Id': '2'} 
State {} 
Camera {'Id': '3'} 
State {} 
Camera {'Id': '4'} 
State {} 

내가 결과에 들어갈이 파이썬 기능을 조정해야 아래 :

<CameraState> 
    <Cameras> 
     <Camera Id="1"> 
      <State>NO_SIGNAL</State> 
     </Camera> 

     <Camera Id="2"> 
      <State>OK</State> 
     </Camera> 
    </Cameras> 
</CameraState> 
+0

수 y 원래 XML 파일의 개요를 추가하면 많은 도움이됩니다. –

답변

0

파싱 된 구조가 있습니다. 그것은 당신이 그것에 접근하는 방법에 관한 것입니다.

getchildren을 사용하여 하위 노드에 액세스하십시오. 재귀 적 구조를 인쇄의 예 :

import xml.etree.ElementTree as ET 


def print_tree(node, prefix=''): 
    print(prefix, node.tag, node.attrib, node.text.strip()) 
    for child in node: 
     print_tree(child, prefix + ' ') 


tree = ET.ElementTree(file=<your file>) 
root = tree.getroot() 

print_tree(root) 

그것은 제공 :

CameraState {} 
Cameras {} 
    Camera {'Id': '1'} 
    State {} NO_SIGNAL 
    Camera {'Id': '2'} 
    State {} OK 

을하지만, 나는 당신이 xmltodict에서 살펴 추천 :

import xmltodict 


with open(<your file>) as f: 
    tree = xmltodict.parse(f.read()) 

print(tree) 

그것은 당신 OrderedDict의를 제공합니다

OrderedDict([('CameraState', OrderedDict([('Cameras', OrderedDict([('Camera', [OrderedDict([('@Id', '1'), ('State', 'NO_SIGNAL')]), OrderedDict([('@Id', '2'), ('State', 'OK')])])]))]))])