AttributeError: objet « NoneType » n'a pas d'attribut « nodeValue »
-
22-10-2019 - |
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
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