我正在使用sikuli(一种Jython语言,尽管它主要是python)来横向查找特定元素的xml树。
如果我写这样的代码:
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)
控制台打印(5,105)(这是x.get('corner')的值)
如果代码是这样的
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语句时返回,而不是等待结果过滤回到顶部,如果你明白我的意思。
关于为什么这些代码段的行为方式不同的任何帮助都会有很大的帮助
答案 0 :(得分: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')