AttrubtyError: объект «nonetype» не имеет атрибута «nodevalue»
-
22-10-2019 - |
Вопрос
Я использую KSOAP для связи между приложением Android и сервером Python, содержащим следующие опубликованные файлы. Я пытаюсь получить все значения в размещенном файле XML. Но я продолжаю получать, AttributeError: 'NoneType' object has no attribute 'nodeValue'
. Анкет Кто -нибудь может сказать мне, что не так с кодом, когда я пытался отладить ошибку, но все еще не смог этого сделать.
Часть XML -файла (только MacFilterList и Node 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
Решение
Это означает, что какой -то метод/атрибут возвращен None
, и вы попытались получить доступ к ней nodeValue
атрибут. Либо ваш алгоритм неверен, либо вам нужно проверить на None
Перед получением доступа к атрибуту. Извините, но я не могу вам помочь больше, я никогда не использовал эту библиотеку.
Другие советы
Неэтипская ошибка появляется по разным причинам. Проблема в том, что нет никакого жесткого способа узнать, что «линия» вызывает ошибку ... что я сделал, было немного играть с файлом po2prop.py, чтобы представить опцию «Печать» ... есть Два способа сделать это: Запросите аргумент командной строки, который приведет к тому, что флаг «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
в разделе импорта файла
Во -первых, не могли бы вы опубликовать сообщение об ошибке? Затем попробуйте выделить строку в вашем коде и для отладки, используйте грязные print node, node.name
(или что -то подобное) перед этой линией, чтобы идентифицировать узел XML, который нарушает вашу защиту.
Затем вы должны понять, почему эта линия - это случай, когда вы не предвидели.
Каким -то образом сейчас все работает нормально. Ранее я удаляю узлы в файле 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