swi*_*201 1 python jython sikuli
我正在使用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)
Run Code Online (Sandbox Code Playgroud)
控制台打印(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)
Run Code Online (Sandbox Code Playgroud)
日志打印出无.我觉得它应该表现相同的方式,我实际上需要它以第二种方式工作.
我认为代码在第一次到达else语句时返回,而不是等待结果被过滤回到顶部,如果你理解我的意思.
任何关于为什么这些代码段行为不同的帮助都会受到极大的关注
如果对于所有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)
Run Code Online (Sandbox Code Playgroud)
这也将遍历树,访问所有节点,直到找到您的节点,或者None在没有匹配节点时返回.
最重要的是这个getiterator()方法:
def traverse(root):
for node in root.getiterator('ecuID'):
if node.get('id') == '16':
return node.get('corner')
Run Code Online (Sandbox Code Playgroud)