2014-04-02 198 views
3

我使用LXML甚至xml.etree.ElementTree模块XML树解析

<?xml version="1.0"?> 
<corners> 
    <version>1.05</version> 
    <process> 
    <name>ss649</name> 
    <statistics> 
     <statistic name="Min" forparameter="modname" isextreme="no" style="tbld"> 
     <value>0.00073</value> 
     <real_value>7.300e-10</real_value> 
     </statistic> 
     <statistic name="Max" forparameter="modname" isextreme="no" style="tbld"> 
     <value>0.32420</value> 
     <real_value>3.242e-07</real_value> 
    </statistic> 
    <variant> 
      <name>Unit</name> 
      <value> 
      <value>Size</value> 
      <statistics> 
       <statistic name="Min" forparameter="modname1" isextreme="no" style="tbld"> 
       <value>0.02090</value> 
       <real_value>2.090e-08</real_value> 
       </statistic> 
       <statistic name="Max" forparameter="modname2" isextreme="no" style="tbld"> 
       <value>0.02090</value> 
       <real_value>2.090e-08</real_value> 
       </statistic> 
     </variant> 

我不得不extarct的所有值,并作出其认为值快译通解析XML文件,但我不能访问子树,我该怎么做?

试图创建一个字典,这将是这样

dict={ 
     'modname' => { 
     'Min' : 0.00073, 
     'Max': 0.32420, 
     } 
} 

回答

2

我已经使用xml.etree.ElementTree模块

dict = {} 
tree = ET.parse('file.xml') 
root=tree.getroot() 
for attribute in root: 
     for stats in attribute.iter('statistics'): #Accessing to child tree of the process 'attribute' 
      for sub_att in stats.iter('statistic'): #Iterating trough the attribute items 
        name  = sub_att.get('name') 
        parameter = sub_att.get('forparameter') 
        for param_value in sub_att.iter('value'): 
         value = param_value.text #Collecting the value of the sub_attribute 
         break      #Speed up the script, skips the <real_value> 
      if not dict.has_key(parameter): 
        dict[parameter] = {} 
      dict[parameter][name] = value 

输出:

dict={ 
     'modname' : { 
     'Min' : 0.00073, 
     'Max': 0.32420, 
     } 
} 
2

xmltodict绝对是你应该考虑使用:

的代码
from pprint import pprint 
import xmltodict 

data = """<?xml version="1.0"?> 
<corners> 
    <version>1.05</version> 
    <process> 
    <name>ss649</name> 
    <statistics> 
     <statistic name="Min" forparameter="modname" isextreme="no" style="tbld"> 
     <value>0.00073</value> 
     <real_value>7.300e-10</real_value> 
     </statistic> 
     <statistic name="Max" forparameter="modname" isextreme="no" style="tbld"> 
     <value>0.32420</value> 
     <real_value>3.242e-07</real_value> 
    </statistic> 
    </statistics> 
    </process> 
</corners>""" 

pprint(xmltodict.parse(data)) 

一条线,你是好去。

希望能为你工作。