我正在使用ksoap在Android应用程序和包含发布的以下文件的python服务器之间进行通信。我试图检索发布的XML文件中的所有值。但我一直在,AttributeError: 'NoneType' object has no attribute 'nodeValue'
。任何人都可以告诉我代码有什么问题,因为我试图调试错误但仍然没有这样做。
XML文件的一部分(只有MacFilterList和Map节点可以为空):
<ProfileList>
<Profile>
<ProfileName>Lab1</ProfileName>
<Owner>admin</Owner>
<Map>Lab</Map>
<Visible>True</Visible>
<MacFilterList>
<string>00:14:BF:9F:5D:3A</string>
<string>00:14:BF:9F:5D:52</string>
<string>00:14:BF:9F:5D:37</string>
<string>00:14:BF:9F:5D:43</string>
</MacFilterList>
</Profile>
.
.
</ProfileList>
soapAPI.py(PROFILE_XML
是指xml文件的文件名。):
def __init__(self):
self.profileFile = Config.PROFILE_XML
self.profile = XML_ProfileDataStore()
self.profile.LoadXMLFile(self.profileFile)
.
.
def GetAllProfileData(self):
self.profileFile = Config.PROFILE_XML
self.profile.LoadXMLFile(self.profileFile)
result = self.profile.GetAllProfileData()
return result
profileData.py(类XML_ProfileDataStore
所在的位置):
def GetAllProfileData(self):
#Get a node list containing nodes with name Location
ProfileList = self.XMLdoc.getElementsByTagName('Profile')
NumArgCheck = 0
profiles=""
#For each location node in list
for profileNode in ProfileList:
#For each child nodes in Location node, compare the XY coordinates
for ChildNode in profileNode.childNodes:
#If child node has profile name profile_name
if (cmp(ChildNode.nodeName, 'ProfileName') == 0):
NumArgCheck += 1
profiles = profiles + ChildNode.firstChild.data + ","
ChildNode = ChildNode.nextSibling
profiles = profiles + ChildNode.firstChild.nodeValue + ","
ChildNode = ChildNode.nextSibling
profiles = profiles + ChildNode.firstChild.nodeValue + ","
ChildNode = ChildNode.nextSibling
profiles = profiles + ChildNode.firstChild.nodeValue
ChildNode = ChildNode.nextSibling
for child in ChildNode.childNodes:
profiles = profiles + "," + child.firstChild.nodeValue
profiles = profiles+";"
return profiles
答案 0 :(得分:2)
这意味着某些方法/属性返回None
,并且您尝试访问其nodeValue
属性。
您的算法错误,或者您需要在访问属性之前测试None
。
对不起,但我不能帮助你,我从未使用过这个库。
答案 1 :(得分:1)
出现NoneType错误。问题是没有硬编码方式来知道“线”导致错误... 我做了什么,是用po2prop.py文件播放一下,以便引入“printline”选项...... 有两种方法可以做到这一点: 一个。请求命令行参数,该参数将导致“printline”标志为true 湾残酷地添加一行来打印该行,然后将其删除或评论(更容易)
(b)是快速执行此操作的简便方法,因此请转到po2prop.py文件并搜索行:
for line in content.splitlines(True):
outputstr = self.convertline(line)
outputlines.append(outputstr)
return u"".join(outputlines).encode(self.encoding)
并在循环代码中添加以下行:
sys.stdout.write(outputstr)
所以它变成了(它在代码中被注释,在需要时取消注释):
for line in content.splitlines(True):
outputstr = self.convertline(line)
outputlines.append(outputstr)
# sys.stdout.write(outputstr)
return u"".join(outputlines).encode(self.encoding)
就这么简单。 提示:不要忘记:
import sys
在文件的导入部分
答案 2 :(得分:0)
首先,您能否发布错误消息?然后,尝试隔离代码中的行,并进行调试,在此行之前使用一些脏print node, node.name
(或类似的东西),以便识别破坏保护的XML节点。
然后你应该能够理解为什么这条线是你没预见到的情况。
答案 3 :(得分:0)
现在一切都运转正常。以前,我删除XML文件中包含任何空元素的节点,当然这将工作正常,因为我发现空元素可能导致错误。但是,现在我替换回原始XML文件并且可以检索数据。这是我编辑的.py文件中的函数,用于检查XML文件中的空元素。
def GetAllProfileData(self):
#Get a node list containing nodes with name Location
ProfileList = self.XMLdoc.getElementsByTagName('Profile')
NumArgCheck = 0
profiles=""
#For each location node in list
for profileNode in ProfileList:
#For each child nodes in Location node, compare the XY coordinates
for ChildNode in profileNode.childNodes:
#If child node has profile name profile_name
if (cmp(ChildNode.nodeName, 'ProfileName') == 0):
NumArgCheck += 1
#If element is empty
if ChildNode.firstChild is not None:
profiles = profiles + ChildNode.firstChild.nodeValue + ","
else:
profiles = profiles + "EMPTY,"
ChildNode = ChildNode.nextSibling
if ChildNode.firstChild is not None:
profiles = profiles + ChildNode.firstChild.nodeValue + ","
else:
profiles = profiles + "EMPTY,"
ChildNode = ChildNode.nextSibling
if ChildNode.firstChild is not None:
profiles = profiles + ChildNode.firstChild.nodeValue + ","
else:
profiles = profiles + "EMPTY,"
ChildNode = ChildNode.nextSibling
if ChildNode.firstChild is not None:
profiles = profiles + ChildNode.firstChild.nodeValue
else:
profiles = profiles + "EMPTY"
ChildNode = ChildNode.nextSibling
if ChildNode.firstChild is not None:
for child in ChildNode.childNodes:
profiles = profiles + "," + child.firstChild.nodeValue
else:
profiles = profiles + ",EMPTY"
profiles = profiles+";"
return profiles