2017-11-29 25 views
0

以下は、Webサービスとエンドポイントからの応答として提供されます。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は、この形式の応答を提供するためにPythonで解析する必要があります。

{'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を表現する古い方法です。私はPythonでlxmlの反復を使用して異なる再帰的なアプローチを試みたが、正しい結果に達することはありません。 Pythonソリューションをお探しですか?

+0

申し訳ありませんが、名前空間の詳細を追加していません。今編集されました。 –

答えて

0

問題の再帰的解を見つけることができます。これは、属性と値を優先し、DFS overタグを実行します。

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())) 
関連する問題