AttributeRor: el objeto 'nonetype' no tiene atributo 'NodeValue'
-
22-10-2019 - |
Pregunta
Estoy usando KSOAP para comunicarme entre una aplicación Android y el servidor Python que contiene los siguientes archivos publicados. Estoy tratando de recuperar todos los valores en el archivo XML publicado. Pero sigo recibiendo AttributeError: 'NoneType' object has no attribute 'nodeValue'
. ¿Alguien puede decirme qué hay de malo en el código mientras intenté depurar el error, pero aún no pude hacerlo?
La parte del archivo XML (solo MacFilterList y el nodo de mapa pueden estar vacíos):
<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
se refiere al nombre de archivo del archivo 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
perfiledata.py (donde la clase, XML_ProfileDataStore
es):
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
Solución
Significa que se devolvió algún método/atributo None
, e intentaste acceder a su nodeValue
atributo. O su algoritmo está mal o necesita probar None
antes de acceder al atributo. Lo siento, pero no puedo ayudarte más que eso, nunca he usado esta biblioteca.
Otros consejos
El error no perturbador aparece por varias razones. El problema es que no hay una forma codificada de saber qué "línea" causa el error ... lo que hice, fue jugar un poco con el archivo PO2Prop.py, para introducir una opción de "línea de impresión" ... Hay Dos formas de hacer eso: a. Solicite un argumento de línea de comando que hará que una bandera de "impresión" sea verdadera b. Agregue brutalmente una línea para imprimir la línea y luego eliminarla o comentarla (más fácil)
(b) es la manera fácil de hacerlo rápidamente, así que vaya a su archivo PO2Prop.py y busque líneas:
for line in content.splitlines(True):
outputstr = self.convertline(line)
outputlines.append(outputstr)
return u"".join(outputlines).encode(self.encoding)
y agregue esta línea en el código de bucle:
sys.stdout.write(outputstr)
Así que se convierte (se comenta en el código, sin consolidad cuando sea necesario):
for line in content.splitlines(True):
outputstr = self.convertline(line)
outputlines.append(outputstr)
# sys.stdout.write(outputstr)
return u"".join(outputlines).encode(self.encoding)
Tan simple como eso. Sugerencia: No olvides:
import sys
en la sección de importación del archivo
Primero, ¿podría publicar el mensaje de error? Luego, intente aislar la línea en su código, y para la depuración, use un poco de sucio print node, node.name
(o algo similar) antes de esta línea, para identificar el nodo XML que está rompiendo su protección.
Luego debería poder entender por qué esta línea es un caso que no previó.
De alguna manera todo funciona bien ahora. Anteriormente, elimino los nodos en el archivo XML que contiene cualquier elemento vacío y, por supuesto, eso funcionaría bien, ya que descubro que el elemento vacío podría estar causando el error. Sin embargo, ahora reemplazo el archivo XML original y se pueden recuperar los datos. Aquí está la función del archivo .py que había editado para verificar si hay un elemento vacío dentro del archivo 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