2014-01-06 6 views
1

Я использую sikuli (язык Jython, хотя это в основном python), чтобы поперек дерева xml, ищущего определенный элемент.Рекурсивный метод python возвращает None

если я пишу такой код:

xmldoc = ('/ProgramData/XXXXX/XXXXX/XXXX/file.xml') 
tree = ET.parse(xmldoc) 
root = tree.getroot() 
transverse(root) 

def transverse(Root): 
    for x in Root: 
     if(x.tag=='ecuID'): 
      if (x.get('id')=='16'): 
       print x.get('corner') 
     else: 
      transverse(x) 

на консоль печатает (5105) (это значение x.get («угол»))

если код, как это

xmldoc = ('/ProgramData/XXXXX/XXXXX/XXXX/file.xml') 
tree = ET.parse(xmldoc) 
root = tree.getroot() 
print transverse(root) 

def transverse(Root): 
    for x in Root: 
     if(x.tag=='ecuID'): 
      if (x.get('id')=='16'): 
       return x.get('corner') 
     else: 
      return transverse(x) 

журнал печатает Нет. Я чувствую, что он должен вести себя одинаково в любом случае, и мне действительно нужно, чтобы он работал вторым способом.

Я думаю, что код возвращается в первый раз, когда он получает инструкцию else, вместо того, чтобы ожидать, что результат будет отфильтрован назад, если вы поймете, что я имею в виду.

Любая помощь, почему эти в коде сегменты ведут себя по-разному будут значительно apriciated

+0

ваше возвращение заявление в блоке еще останавливает выполнение цикла, независимо от других элементов в корне. вам нужно изменить свое, так что вы вызываете поперечное, проверяете результат, возвращаете его, если нет, продолжайте цикл в противном случае. – njzk2

+0

Это может помочь любому, кто смотрит на это http://docs.python.org/2/library/xml.etree.elementtree.html – switch201

+0

Привет, njzk2 Ваша помощь сработала, я изменил ее на это – switch201

ответ

5

Если для всех x в Root, x.tag == 'ecuID' является True но x.get('id') == '16' является неTrue, то цикл никогда не достигает return заявление, и вместо этого возвращается None.

Это также происходит, когда Root представляет собой пустую последовательность, например, для любого элемента листа в дереве узлов.

Если какой-либо узел <ecuID id="16"> встречается там, где нет нетnode атрибута, то None возвращается, а, как x.get('corner') возвратит значение по умолчанию вместо.

Вместо того, чтобы рекурсивно, почему бы не использовать метод стека?

def traverse(node): 
    stack = [node] 
    while stack: 
     next = stack.pop() 
     for node in next: 
      if node.tag == 'ecuID' and node.get('id') == '16': 
       return node.get('corner') 
      stack.append(node) 

Это будет перемещаться по дереву, а также, посещая все узлы, пока ваш узел не найден или None возвращается, когда нет соответствующего узла.

Лучше всего было бы просто быть getiterator() метод:

def traverse(root): 
    for node in root.getiterator('ecuID'): 
     if node.get('id') == '16': 
      return node.get('corner') 
+1

Он также может возвращать 'None', если' 'corner'' не находится в' x', правильно? – SethMMorton

+0

@SethMMorton: действительно. –

Смежные вопросы