Question

J'utilise ksoap pour communiquer entre une application Android et le serveur python contenant les fichiers suivants affichés. Je suis en train de récupérer toutes les valeurs dans le fichier XML affiché. Mais je continue à obtenir, AttributeError: 'NoneType' object has no attribute 'nodeValue'. Quelqu'un peut-il me dire ce qui ne va pas avec le code comme je l'ai essayé de déboguer l'erreur, mais toujours pas de le faire.

partie du fichier XML (seul nœud MacFilterList et carte peut être vide):

<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 fait référence au nom de fichier du fichier 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 (où la classe, est 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
Était-ce utile?

La solution

Cela signifie qu'une méthode / attribut retourné None, et vous avez essayé d'accéder à son attribut nodeValue. Soit votre algorithme est erroné, ou vous avez besoin de tester pour None avant d'accéder à l'attribut. Désolé mais je ne peux pas vous aider plus que cela, je ne l'ai jamais utilisé cette bibliothèque.

Autres conseils

erreur NoneType apparaît pour diverses raisons. Le problème est qu'il n'y a aucun moyen de savoir ce que hardcoded « ligne » provoque l'erreur ... Ce que je faisais, était jouer un peu avec le fichier po2prop.py, afin d'introduire une option « Printline » ... Il y a deux façons de le faire: une. Demander un argument de ligne de commande qui provoque un drapeau « Printline » pour être vrai b. Brutalement ajouter une ligne à imprimer la ligne, puis retirez-le ou en commentaire (plus facile)

(b) est le moyen facile de le faire rapidement, alors allez à votre fichier po2prop.py et rechercher des lignes:

    for line in content.splitlines(True):
        outputstr = self.convertline(line)
        outputlines.append(outputstr)
    return u"".join(outputlines).encode(self.encoding)

et ajoutez cette ligne dans le code de la boucle:

        sys.stdout.write(outputstr)

Il devient donc (il est commenté dans le code, décommentez si nécessaire):

    for line in content.splitlines(True):
        outputstr = self.convertline(line)
        outputlines.append(outputstr)
    #   sys.stdout.write(outputstr)
    return u"".join(outputlines).encode(self.encoding)

Aussi simple que cela. TRUC: NE PAS OUBLIER:

    import sys

à la section d'importation du fichier

Tout d'abord, pourriez-vous publier le message d'erreur? Ensuite, essayez d'isoler la ligne dans votre code, et pour le débogage, utilisez un print node, node.name de sale (ou quelque chose de similaire) avant cette ligne, afin d'identifier le noeud XML qui casse votre protection.

Vous devriez alors être en mesure de comprendre pourquoi cette ligne est un cas où vous ne prévoyais.

D'une certaine façon tout fonctionne bien maintenant. Auparavant, je supprime les noeuds dans le fichier XML contenant des éléments vides et bien sûr qui travailleraient bien que je trouve que l'élément vide pourrait être la cause de l'erreur. Cependant, maintenant je remplace le fichier sur XML d'origine et les données peuvent être récupérées. Voici la fonction à partir du fichier .py que j'avais édité pour vérifier élément vide dans le fichier 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top