2014-07-01 67 views
0

我解析從Web服務SOAP API通過皁液客戶端返回的對象意外的屬性錯誤

我有attributeObjects的列表,像

(defectStateAttributeValueDataObj){ 
    attributeDefinitionId = 
     (attributeDefinitionIdDataObj){ 
     name = "Comment" 
     } 
    attributeValueId = 
     (attributeValueIdDataObj){ 
     name = "Owner changed because of default owner assignment specified in the component map" 
     } 
} 

(defectStateAttributeValueDataObj){ 
    attributeDefinitionId = 
     (attributeDefinitionIdDataObj){ 
     name = "OwnerName" 
     } 
    attributeValueId = 
     (attributeValueIdDataObj){ 
     name = "Schmoe, Joe" 
     } 
} 

我使用以下循環提取鍵/值對:

for defect in myDefectsPage.mergedDefects : 
    print defect.cid, 
    for attribute in defect.defectStateAttributeValues: 
     print attribute 
     attr= attribute.attributeDefinitionId.name 
     val=attribute.attributeValueId.name 
     print attr,'=',val, 
     print ""  

(以上對象是打印屬性命令的結果)

這將如預期對於每一個屬性,除了一個其中attribute.attributeDefinitionId.name ==對於一個I「註釋」

得到

回溯(最後最近一次調用): 文件,63行,在 VAL = attribute.attributeValueId.name AttributeError的: '文本' 對象有沒有屬性 '名'

這很奇怪,因爲如果使用 VAL = attribute.attributeValueId#.NAME 它將打印

Commment =(attributeValueIdDataObj){ 名稱=「所有者改變,因爲在組件映射指定的默認所有者分配的」 }

所以它看起來像是一個attributeValueIdDataObj並且有一個名稱屬性。

我使用了suds DEBUG日誌記錄和XML返回元素看起來完全一樣,無論attribute.attributeDefinitionId.name是什麼。

我也沒辦法試圖訪問的name屬性

任何想法時,它如何改變成「文本」的對象?

+0

解決方法: 值Id = attribute.attributeValueId 如果hasattr(VALUEID, '名'): VAL = VALUEID。名稱 else: val = valueId 工作,它表明它確實是一個attributeValueIdDataObj,它有一個名稱屬性,只是hasattr()處理AttributeError異常,而getattr()或.name則不處理。 奇怪... – user3795282

回答

0

在進一步的檢查中(並在異常發生時打印出返回對象的類型),這是Web服務SOAP服務器中的一個錯誤。

當評論是空的,它返回一個

<attributeValueId/> 

標籤,

代替的適當

<attributeValueId> 
     <name/> 
</attributeValueId> 

對象。所以它導致了sax.Text對象而不是suds.attributeValueIdDataObj對象

所以沒有python或suds的奧祕來解決。

很抱歉的誤報...