2014-07-01 51 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的奥秘来解决。

很抱歉的误报...