2014-03-13 22 views
0
解析

我有下面的XML這是我從網頁解析:的Python如果超過XML別的例外與ElementTree的

<!-- 
Parts from the iGEM Registry of Standard Biological Parts 
--> 
<rsbpml> 
<part_list> 
    <part> 
    <part_id>151</part_id> 
    <part_name>BBa_B0034</part_name> 
    <part_short_name>B0034</part_short_name> 
    <part_short_desc>RBS (Elowitz 1999) -- defines RBS efficiency</part_short_desc> 
    <part_type>RBS</part_type> 
    <release_status>Released HQ 2013</release_status> 
    <sample_status>In stock</sample_status> 
    <part_results>Works</part_results> 
    <part_nickname>SAMT</part_nickname> 
    <part_rating/> 
    <part_url>http://parts.igem.org/Part:BBa_J45001</part_url> 
    <part_entered>2006-06-07</part_entered> 
    <part_author>Kate Broadbent</part_author> 
    <deep_subparts/> 
    <specified_subparts/> 
    <specified_subscars/> 
    <sequences>...</sequences> 
    <features>...</features> 
    <parameters> 
    <!--...--> 
    <!--...--> 
    <parameter>...</parameter> 
    <parameter> 
    <name>swisspro</name> 
    <value>Q8H6N2</value> 

我有一些代碼返回swisspro參數值; Q8H6N2。但是,如果不存在swisspro參數,我希望代碼發出錯誤。

到目前爲止,我已經嘗試下面的代碼,但它不工作:

def part_attrib(self,x): 
     if x == 'uniprot_id': 
      for parameter in self.root.iter(tag='parameter'): 
       name = parameter.find('name') 
       if name is not None and name.text == 'swisspro': 
        return parameter.find('value').text 
       else: 
        return "No UniProt ID present." 

隨着該else聲明存在,該代碼總是輸出錯誤陳述是否存在目前swisspro參數。如果我省略else參數,則代碼有效,但如果不存在swisspro參數,則不會引發錯誤。

我在做什麼錯?

我應該強調在XML中有幾個<paramter>部分。

回答

1

您可以在循環之前設置的值:

swisspro_value = None 

for parameter in self.root.iter(tag='parameter'): 
    name = parameter.find('name') 
    if name is not None and name.text == 'swisspro': 
     swisspro_value = parameter.find('value').text 
     break 

return swisspro_value or "No UniProt ID present." 
+0

是的,那有效。非常感謝! – Charon

0

既然你在你的循環,你也可以只返回你的錯誤消息,如果你把它的功能端返回,

def part_attrib(self,x): 
     if x == 'uniprot_id': 
      for parameter in self.root.iter(tag='parameter'): 
       name = parameter.find('name') 
       if name is not None and name.text == 'swisspro': 
        return parameter.find('value').text 
     return "No UniProt ID present."