0

理解できないように見えるpython XML解析の問題があります。

次の XML があります。

<data>
  <data_in base="base64">
  </data_in>
  <log_sense_data>
    <ds base="bool">1</ds>
    <spf base="bool">0</spf>
    <page_code base="hex">15</page_code>
    <background_scan_results_log_page>
      <parameter>
        <parameter_code base="hex">0000</parameter_code>
        <du base="bool">0</du>
        <tsd base="bool">0</tsd>
        <etc base="bool">0</etc>
        <tmc base="hex">00</tmc>
        <format_linking base="hex">03</format_linking>
        <parameter_length base="dec">12</parameter_length>
        <description base="string">background scanning status parameter</description>
        <accumulated_power_on_minutes base="dec">579578</accumulated_power_on_minutes>
        <background_scanning_status base="hex">01</background_scanning_status>
        <number_of_background_scans_performed base="dec">112</number_of_background_scans_performed>
        <background_scan_progress base="hex">00000036</background_scan_progress>
        <number_of_background_medium_scans_performed base="dec">112</number_of_background_medium_scans_performed>
      </parameter>
      <parameter>
        <parameter_code base="hex">0001</parameter_code>
        <du base="bool">0</du>
        <tsd base="bool">0</tsd>
        <etc base="bool">0</etc>
        <tmc base="hex">00</tmc>
        <format_linking base="hex">03</format_linking>
        <parameter_length base="dec">20</parameter_length>
        <description base="string">background medium scan parameter</description>
        <accumulated_power_on_minutes base="dec">82932</accumulated_power_on_minutes>
        <reassign_status base="hex">05</reassign_status>
        <sense_key base="hex">01</sense_key>
        <additional_sense_code base="hex">17</additional_sense_code>
        <additional_sense_code_qualifier base="hex">01</additional_sense_code_qualifier>
        <vendor_specific base="hex">20e2570187</vendor_specific>
        <logical_block_address base="hex">00000000478994d8</logical_block_address>
      </parameter>
      <parameter>
        <parameter_code base="hex">0002</parameter_code>
        <du base="bool">0</du>
        <tsd base="bool">0</tsd>
        <etc base="bool">0</etc>
        <tmc base="hex">00</tmc>
        <format_linking base="hex">03</format_linking>
        <parameter_length base="dec">20</parameter_length>
        <description base="string">background medium scan parameter</description>
        <accumulated_power_on_minutes base="dec">104467</accumulated_power_on_minutes>
        <reassign_status base="hex">05</reassign_status>
        <sense_key base="hex">01</sense_key>
        <additional_sense_code base="hex">18</additional_sense_code>
        <additional_sense_code_qualifier base="hex">07</additional_sense_code_qualifier>
        <vendor_specific base="hex">203ab846ea</vendor_specific>
        <logical_block_address base="hex">00000000133d5046</logical_block_address>
      </parameter>
    </background_scan_results_log_page>
  </log_sense_data>
</data>

Parameter_code 0000 は常に存在し、その後に任意の数の parameter_codes が存在する可能性があります。基本的に、parameter_code 0000 から 2 つの値 (電源投入時間、バックグラウンド スキャン) と、parameter_code 0001 以降のほとんどの値を取得して、後でデータベースに入れたいと考えています。私がこれまでに持っているコードは次のとおりです。

import xml.etree.ElementTree as et
log_page_tree = et.fromstring(results['Data']['RawData'])
if log_page_tree.find('log_sense_data') == None:
        continue
    else:
        for element in log_page_tree.find('log_sense_data'):
            for pagecode in element.iter('page_code'):
                if pagecode.text == '15':
                    for param in log_page_tree.find('log_sense_data').find('background_scan_results_log_page'):
                        for derp in param.iter():
                            print derp.tag, derp.text
                #for totalpoweron in param.iter('accumulated_power_on_minutes'):
                                    #print totalpoweron.text

parameter_code 0000 からの 2 つの値を保持しながら、残りの parameter_codes を反復処理してデータベースに格納できるようにしたいと考えています。誰かがここで正しい方向に私を押してくれますか? 各値を取得するために param.iter('somevalue') を指定すると、コードが繰り返されないようです。

4

1 に答える 1

0

OK、コードを簡素化/改善する方法はありますが、ここまでで満足しているようです:

for param in log_page_tree.find('log_sense_data').find('background_scan_results_log_page'):

これは実際には、各 を反復処理しますparameter

parameter_codeしかし、今度は がであるかどうかをオンにし0000て、それぞれの場合で異なることを行いたいと考えています。そう:

converters = {
    'hex': lambda s: int(s, 16)
    'dec': int,
    'bool': bool
}

if param.find('parameter_code').text == '0000':
    accumulated_power_on_minutes = int(param.find('accumulated_power_on_minutes').text)
    number_of_background_scans_performed = int(param.find('number_of_background_scans_performed').text)
else:
    obj = {}
    for elem in param.getchildren():
        name = elem.tag
        base = elem.attrib['base']
        converter = converters.get(base, lambda x: x)
        value = convert(elem.text)
        obj[name] = value
    # do something with obj
于 2013-05-30T00:53:31.747 に答える