AttributeError: объект «NoneType» не имеет атрибута «nodeValue»

Я использую 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

person user918197    schedule 04.09.2011    source источник


Ответы (4)


Это означает, что какой-то метод/атрибут вернул None, и вы попытались получить доступ к его атрибуту nodeValue. Либо ваш алгоритм неверен, либо вам нужно проверить None перед доступом к атрибуту. Извините, но больше ничем помочь не могу, я никогда не пользовался этой библиотекой.

person Bastien Léonard    schedule 04.09.2011
comment
некоторые элементы в файле xml являются пустыми элементами, ‹Map/› и ‹MacFilterList/›. Однако после того, как я реализовал некоторую строку кодирования для проверки таких случаев, ошибка все еще остается. А также я создал файл .py на сервере для извлечения данных вместо использования клиентского приложения Android, которое я смог сделать, но не приложение. - person user918197; 05.09.2011

Ошибка NoneType появляется по разным причинам. Проблема в том, что не существует жестко закодированного способа узнать, какая «строка» вызывает ошибку… Что я сделал, так это немного поиграл с файлом po2prop.py, чтобы ввести опцию «printline»… Есть два способа сделать это: а. Запросите аргумент командной строки, который приведет к тому, что флаг "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

в разделе импорта файла

person Stavros    schedule 15.09.2012

Во-первых, не могли бы вы опубликовать сообщение об ошибке? Затем попробуйте изолировать строку в своем коде и для отладки использовать какой-нибудь грязный print node, node.name (или что-то подобное) перед этой строкой, чтобы определить узел XML, который нарушает вашу защиту.

Тогда вы должны быть в состоянии понять, почему эта линия является случаем, которого вы не предвидели.

person Joël    schedule 05.09.2011

Почему-то сейчас все работает нормально. Ранее я удалял узлы в 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
person user918197    schedule 05.09.2011
comment
Трассировка (последний последний вызов): Файл C:\Users\Qingyan\Desktop\Server\SOAPpy\Server.py, строка 407, в d o_POST fr = apply(f, order_args, named_args) Файл C:\Users\Qingyan\ Desktop\Server\WifiPositionSoapAPI.py, строка 123, в GetAllProfileData result = self.profile.GetAllProfileData() File C:\Users\Qingyan\Desktop\Server\ProfileDataStore.py, строка 153, в GetAllProfileData profiles = profiles + ChildNode.firstChild .nodeValue + , AttributeError: объект «NoneType» не имеет атрибута «nodeValue» - person user918197; 06.09.2011