2017-11-29 5 views
0

아래 XML은 웹 서비스 및 끝점에서 응답으로 제공됩니다.Python : xml을 구문 분석하여 계층 구조를 유지하여 값의 키 및 값을 값으로 가져옵니다.

 <ns2:getModuleAnswersResponse xmlns:ns2="http://www.example.com/ManagerService"> 
     <ns2:answer> 
      <ns2:answer key="storage"> 
       <ns2:value key="failover">true</ns2:value> 
       <ns2:answer key="timeseries"> 
       <ns2:answer key="socketconnector"> 
        <ns2:value key="host">localhost</ns2:value> 
        <ns2:value key="port">2020</ns2:value> 
       </ns2:answer> 
       </ns2:answer> 
      </ns2:answer> 
      <ns2:answer key="frontendws"> 
       <ns2:answer key="tomcat"> 
       <ns2:value key="host">localhost</ns2:value> 
       <ns2:value key="protocol">http</ns2:value> 
       <ns2:value key="username">user</ns2:value> 
       <ns2:value key="password">abc</ns2:value> 
       </ns2:answer> 
       <ns2:value key="instance">WS</ns2:value> 
      </ns2:answer> 
      <ns2:answer key="topologyservice"> 
       <ns2:value key="host">localhost</ns2:value> 
       <ns2:answer key="gateway2"> 
       <ns2:value key="host">localhost</ns2:value> 
       <ns2:value key="port">48443</ns2:value> 
       <ns2:value key="authentication">certificate</ns2:value> 
       </ns2:answer> 
      </ns2:answer> 
      <ns2:answers key="connection"> 
       <ns2:answer> 
       <ns2:answer key="primary"> 
        <ns2:answer key="vcenter"> 
         <ns2:value key="host">localhost</ns2:value> 
         <ns2:value key="username">admin</ns2:value> 
         <ns2:value key="password">abc</ns2:value> 
        </ns2:answer> 
       </ns2:answer> 
       </ns2:answer> 
      </ns2:answers> 
      <ns2:value key="use_advancedsettings">false</ns2:value> 
     </ns2:answer> 
    </ns2:getModuleAnswersResponse> 

이 XML은이 형식으로 응답을 제공하기 위해 파이썬에서 구문 분석되어야합니다.

{'storage': 
    {'failover': 'true', 'timeseries': 
     {'socketconnector': 
      {'host': 'localhost', 
      'port': '2020' 
      } 
     } 
    }, 
'frontendws': 
    {'tomcat': 
     { 'host': 'localhost', 
      'port': '2020', 
      'username': 'user', 
      'password': 'abc' 
     }, 'instance': 'WS' 
    }, 
'topologyservice': 
    {'host': 'localhost', 
    'gateway2': 
     {'host': 'localhost', 
     'username': 'admin', 
     'password': 'abc' 
     } 
    }, 
'connection': 
    {'primary': 
     {'vcenter': 
      {'host': 'localhost', 
      'username': 'admin', 
      'password': 'abc' 
      } 
     } 
    }, 
'use_advancedsettings': 'false' 
} 

이것은 XML을 나타내는 오래된 방법입니다. 나는 파이썬에서 lxml 반복을 사용하여 다른 재귀 접근법을 시도했지만 정확한 결과에 도달하지는 못했다. 파이썬 솔루션을 찾고

+0

네임 스페이스 세부 정보를 추가하지 않아서 죄송합니다. 지금 편집되었습니다. –

답변

0

주어진 문제에 대한 재귀 적 해결책을 찾을 수 있습니다. 이는 속성 및 값에 우선 순위를 부여하고 태그 위에 DFS를 수행합니다.

import xml.etree.ElementTree as ET 

def func(element): 
    my_json = {} 

    '''Base Condition''' 
    if len(element.getchildren()) == 0: 
     json = {} 

     if element.attrib: 
      if element.text: 
       json.update({element.attrib['key']: element.text}) 
      else: 
       json.update({element.attrib['key']: {}}) 

     return json 

    for child in element.getchildren(): 
     i = 0 
     if element.attrib: 
      if element.attrib['key'] in my_json: 
       my_json[element.attrib['key']].update(func(child)) 
      else: 
       my_json[element.attrib['key']] = func(child) 
     else: 

      if i in my_json: 
       my_json[i].update(func(child)) 
      else: 
       my_json[i] = func(child) 

      i += 1 

    return my_json 

root = ET.parse('test.xml') 
print(func(root.getroot())) 
관련 문제