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
¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top