'NoneType'对象没有属性'data'

时间:2010-06-04 18:41:45

标签: python

我正在向我的服务器发送SOAP请求并获取响应。响应字符串的示例如下所示:

<?xml version = '1.0' ?>
<env:Envelope xmlns:env=http:////www.w3.org/2003/05/soap-envelop
.
..
..
<env:Body>
    <epas:get-all-config-resp xmlns:epas="urn:organization:epas:soap"> ^M
...
...
<epas:property name="Tom">12</epas:property>
> 
> <epas:property name="Alice">34</epas:property>
> 
> <epas:property name="John">56</epas:property>
> 
> <epas:property name="Danial">78</epas:property>
> 
> <epas:property name="George">90</epas:property>
> 
> <epas:property name="Luise">11</epas:property>

...
^M
</env:Body?
</env:Envelop>

我在回答中注意到,身体中显示的额外字符是“^ M”。不确定这可能是问题所在。注意^ M显示!  当我尝试解析从服务器返回的字符串以使用代码示例获取名称和值时:

elements = minidom.parseString(xmldoc).getElementsByTagName("property")      
myDict = {}
for element in elements:
  myDict[element.getAttribute('name')] = element.firstChild.data

但是,我收到了这个错误:'NoneType'对象没有属性'data'。可能是它与xml响应中显示的“^ M”有关!

任何想法/意见将不胜感激,

干杯

4 个答案:

答案 0 :(得分:3)

[编辑更清晰,并建议寻找空元素]

显然,getElementsByTagName返回的一些元素没有firstChild。当元素为空时会发生这种情况,如

<epas:property name="Empty"></epas:property>

当minidom遇到这种情况时,它会将“element.firstChild”设置为None。这很可能发生在你身上。

否则,很难说只有XML的一个片段(以及一个破碎的片段)确实发生了什么,但你可以尝试捕获异常并检查有问题的元素:

for element in elements:
    try:
        myDict[element.getAttribute('name')] = element.firstChild.data
    except AttributeError:
        print element, element.firstChild

或者,您可以调用调试器(import pdb; pdb.set_trace()),而不是简单地打印元素。然后你可以看到元素,并理解它为什么会给你带来麻烦。

顺便说一句,“^ M”只是一个windows式的回车。我修改了你粘贴的xml片段,在本地进行测试,“^ M”没有任何区别,minidom负责处理它。

因此,检查一个空元素,或者按照我的建议使用try / except。如果您仍然无法判断发生了什么,请粘贴完整的XML字符串(例如,在http://pastebin.com/),我可能会提供帮助。

此外,在相关的说明中:一旦您解决了这个问题,您可以使用列表理解构建字典:

myDict = dict((element.getAttribute('name'), element.firstChild.data) for element in elements)

而且,如果您确定这是一个空元素的问题,那么您可以跳过它们:

myDict = dict((element.getAttribute('name'), element.firstChild.data) for element in elements if element.firstChild is not None)

答案 1 :(得分:1)

你可以过滤第一个子元素为None的元素,它似乎是^ M确实,它可能被转换为TextNode对象,一个没有数据的空白对象。

elements = minidom.parseString(xmldoc).getElementsByTagName("property")      
myDict = {}
for element in elements:
    if element.firstChild:
        myDict[element.getAttribute('name')] = element.firstChild.data

答案 2 :(得分:0)

错误表示您的某个元素的firstChild已设置为None,因此尝试访问其.data会导致错误。

我怀疑尾随^ M是问题所在。为^ M生成的元素无效,并且/它没有firstChild元素。

您可以通过检查firstChild是否等于None来解决此问题,然后再尝试提取其.data成员。

答案 3 :(得分:0)

element.firstChild是None。你确定你不想要element.data吗?我猜想firstChild是指元素的第一个子元素而不是文本节点。