2013-05-17 81 views
0

我真的被這個困住了!我從亞馬遜獲得一些產品數據,這些數據以XML形式返回。當搜索關鍵字有效時,它會返回XML節點Items>Item。如果關鍵字錯誤,或者沒有返回有效結果的關鍵字,則不存在Item節點。我正在使用一些函數將這個XML轉換爲對象以便於解析。然後使用hasattr遞歸檢查各個節點。方法'hasattr'沒有正確測試屬性?

data = someXMLConverter(xml) 

#works 
if hasattr(data, 'Items'): 
    #doesn't work 
    if hasattr(data.Items, 'Item'): 
     #some processing here 
    else: 
     return 'Error' 
else: 
    return 'Error' 

即使Item節點不存在,hasattr返回true。所以如果發生錯誤,我的網站會爆炸!

任何想法?

示例XML:

<ItemSearchResponse> 
    <OperationRequest> 
     <HTTPHeaders><Header Name="UserAgent" Value="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0"/></HTTPHeaders> 
     <RequestId>a393e9db-b86e-41de-965d-922c947056ff</RequestId> 
     <Arguments> 
      <Argument Name="Operation" Value="ItemSearch"/> 
      <Argument Name="Service" Value="AWSECommerceService"/> 
      <Argument Name="Signature" Value="z/R9HjzqukC6J53bmF4LPxh/xtlwBv9k+u6QjGsgFmA="/> 
      <Argument Name="ItemPage" Value="1"/> 
      <Argument Name="AssociateTag" Value="rutwsblog-20"/> 
      <Argument Name="Version" Value="2006-09-11"/> 
      <Argument Name="Keywords" Value="dggd"/> 
      <Argument Name="AWSAccessKeyId" Value="AKIAJ3TAUM7ANQFQYP7Q"/> 
      <Argument Name="Timestamp" Value="2013-05-17T16:50:55"/> 
      <Argument Name="ResponseGroup" Value="Medium"/> 
      <Argument Name="SearchIndex" Value="Books"/> 
     </Arguments> 
     <RequestProcessingTime>0.0217790000000000</RequestProcessingTime> 
    </OperationRequest> 
    <Items> 
     <Request> 
      <IsValid>True</IsValid> 
      <ItemSearchRequest> 
       <ItemPage>1</ItemPage> 
       <Keywords>dggd</Keywords> 
       <ResponseGroup>Medium</ResponseGroup> 
       <SearchIndex>Books</SearchIndex> 
      </ItemSearchRequest> 
      <Errors> 
       <Error> 
        <Code>AWS.ECommerceService.NoExactMatches</Code> 
        <Message>We did not find any matches for your request.</Message> 
       </Error> 
      </Errors> 
     </Request> 
     <TotalResults>0</TotalResults> 
     <TotalPages>0</TotalPages> 
      <MoreSearchResultsUrl>http://www.amazon.com/gp/redirect.html?camp=2025&creative=386001&location=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fsearch%3Fkeywords%3Ddggd%26url%3Dsearch-alias%253Dstripbooks&linkCode=xm2&tag=xxxx-20&SubscriptionId=xxxx</MoreSearchResultsUrl> 
    </Items> 
</ItemSearchResponse> 
+0

這些是什麼類型的對象?換句話說,你使用的是什麼XML API? –

+0

什麼是確切的代碼和追溯?這可能是你對錯誤發生的分析。 –

+0

不是API,而是我在網站上找到的一些自定義功能。 2年前,當我創建應用程序時,我找不到任何能正確轉換Amazon XML的庫! –

回答

2

您可以使用以下方法來避免還當你None

data = someXMLConverter(xml) 

if hasattr(data, 'Items'): 
    if hasattr(data.Items, 'Item') and data.Items.Item is not None: 
     #some processing here 
    else: 
     return 'Error' 
else: 
    return 'Error' 

由於if語句短路如果hasattr回報False我們可以放心地檢查處理爲None之後。

+0

我會試試這個,同時你可以檢查上面我的問題中粘貼的錯誤XML。 –

+0

男人你是我的英雄!這解決了我的問題!謝謝,我的工作取決於此;) –