Function returns none

N

noahlt

I'm trying to write a website updating script, but when I run the
script, my function to search the DOM tree returns None instead of what
it should.

I have this program:
--------
import sys
from xml.dom.minidom import parse


# search the tree for an element with a particular class

def findelement(current, classtofind, topnode = None):
if topnode == None: topnode = current



# if it's an xml element...
if current.nodeType == 1:
print current.nodeName, ':', current.getAttribute('class')
if current.getAttribute('class') == classtofind:
print 'Returning node:', current
return current
elif current.hasChildNodes():
findelement(current.firstChild, classtofind, topnode)
elif current.nextSibling:
findelement(current.nextSibling, classtofind, topnode)

elif (current.parentNode != topnode) \

and (current.parentNode.nextSibling != None):

findelement(current.parentNode.nextSibling, classtofind,
topnode)
else:

print 'Returning None...'

return None

# others (text, comment, etc)

else:

if current.nextSibling:

findelement(current.nextSibling, classtofind, topnode)

elif (current.parentNode != topnode) \

and (current.parentNode.nextSibling != None):

findelement(current.parentNode.nextSibling, classtofind,
topnode)
else:

print 'Returning None...'

return None



# parse the document

blog = parse('/home/noah/dev/blog/template.html')



# find a post

postexample = findelement(blog.documentElement, 'post')



print 'Got node: ', postexample

-----

My output is this:

-----
html :
head :
title :
body :
h1 :
ul :
li :
h2 :
ol :
li : post
Returning node: <DOM Element: li at -0x48599c74>
Got node: None
 
C

Carsten Haese

I'm trying to write a website updating script, but when I run the
script, my function to search the DOM tree returns None instead of what
it should.

I have this program:
--------
import sys
from xml.dom.minidom import parse


# search the tree for an element with a particular class

def findelement(current, classtofind, topnode = None):
if topnode == None: topnode = current



# if it's an xml element...
if current.nodeType == 1:
print current.nodeName, ':', current.getAttribute('class')
if current.getAttribute('class') == classtofind:
print 'Returning node:', current
return current
elif current.hasChildNodes():
findelement(current.firstChild, classtofind, topnode)
elif current.nextSibling:
findelement(current.nextSibling, classtofind, topnode)

elif (current.parentNode != topnode) \

and (current.parentNode.nextSibling != None):

findelement(current.parentNode.nextSibling, classtofind,
topnode)
else:

print 'Returning None...'

return None

# others (text, comment, etc)

else:

if current.nextSibling:

findelement(current.nextSibling, classtofind, topnode)

elif (current.parentNode != topnode) \

and (current.parentNode.nextSibling != None):

findelement(current.parentNode.nextSibling, classtofind,
topnode)
else:

print 'Returning None...'

return None



# parse the document

blog = parse('/home/noah/dev/blog/template.html')



# find a post

postexample = findelement(blog.documentElement, 'post')



print 'Got node: ', postexample

-----

My output is this:

-----
html :
head :
title :
body :
h1 :
ul :
li :
h2 :
ol :
li : post
Returning node: <DOM Element: li at -0x48599c74>
Got node: None
-----

The function finds the right element fine, and says it will return <DOM
Element: li at -0x48599c74>, but the program gets None instead. What's
happening here? Any suggestions?

You have a lot of cases where findelement is called recursively and then
its return value is discarded instead of being turned into a return
value to the caller. In those cases, execution simply falls off the end
of the function and None is returned implicitly (and silently, since you
don't have a print "Returning None" at the end of the function).

HTH,

Carsten.
 
K

Kent Johnson

I'm trying to write a website updating script, but when I run the
script, my function to search the DOM tree returns None instead of what
it should.

When you call findelement() recursively you have to return the value from the recursive call to the next caller up. See example below.

Kent
I have this program:
--------
import sys
from xml.dom.minidom import parse


# search the tree for an element with a particular class

def findelement(current, classtofind, topnode = None):
if topnode == None: topnode = current



# if it's an xml element...
if current.nodeType == 1:
print current.nodeName, ':', current.getAttribute('class')
if current.getAttribute('class') == classtofind:
print 'Returning node:', current
return current
elif current.hasChildNodes():
findelement(current.firstChild, classtofind, topnode)

Should be
return findelement(current.firstChild, classtofind, topnode)
and similarly wherever you call findelement().
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,172
Messages
2,570,934
Members
47,475
Latest member
ShannonGro

Latest Threads

Top