3

我正在使用 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
4

4 回答 4

3

这意味着返回了某些方法/属性None,并且您尝试访问其nodeValue属性。您的算法错误,或者您需要None在访问属性之前进行测试。对不起,但我不能帮助你更多,我从来没有使用过这个库。

于 2011-09-04T15:39:53.280 回答
1

由于各种原因出现 NoneType 错误。问题是没有硬编码的方法可以知道是什么“行”导致错误...我所做的是对 po2prop.py 文件进行一些操作,以便引入“打印行”选项...有有两种方法可以做到这一点:请求一个命令行参数,该参数将导致“printline”标志为真 b. 粗暴地添加一行以打印该行,然后将其删除或注释它(更容易)

(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

在文件的导入部分

于 2012-09-15T14:26:38.273 回答
0

首先,您能发布错误消息吗?然后,尝试隔离代码中的行,并print node, node.name在此行之前使用一些脏(或类似的东西)进行调试,以识别破坏保护的 XML 节点。

然后,您应该能够理解为什么这条线是您没有预见到的情况。

于 2011-09-05T08:50:13.583 回答
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
于 2011-09-05T15:17:19.733 回答