<p>在第二个版本中,您将忽略递归调用的返回值。您的第一个版本至少仍返回该返回值:</p>
<pre><code>for fieldchild in field.findall('field'):
return findXXX(fieldchild)
</code></pre>
<p>函数中的<code>return</code>语句返回给<em>直接调用方</em>,而不是最外层的第一次调用<code>findXXX()</code>的调用方。你知道吗</p>
<p>但是现在只有<code>field.findall()</code>列表中第一个</em><code>field</code>的结果会返回一些东西。您可能希望返回第一个<em>而不是<code>None</code></em>:</p>
<pre><code>for fieldchild in field.findall('field'):
result = findXXX(fieldchild)
if result is not None:
return result
</code></pre>
<p>这将启动对每个<code>field</code>元素的递归搜索,并返回不是<code>None</code>的<em>第一个</em>此类递归调用的结果。你知道吗</p>
<p>请注意,您没有<em>要递归的</em>;也可以使用<a href="https://docs.python.org/2/library/xml.etree.elementtree.html#xpath-support" rel="nofollow">XPath expression</a>在树中搜索,而不必自己递归:</p>
<pre><code>field.find(".//field[@showname='XXX']")
</code></pre>
<p>这将返回第一个<code>field</code>标记,其<code>name</code>属性设置为<code>XXX</code>,<em>递归搜索</em>。你知道吗</p>
<p>演示:</p>
<pre><code>>>> from xml.etree import ElementTree as ET
>>> tree = ET.fromstring('''\
... <root>
... <field name ="1">
... <field name ="2" showname ="ZZZ">
... <field name ="3" showname="YYY">
... <field name ="4" showname="XXX"/>
... </field>
... </field>
... </field>
... </root>
... ''')
>>> tree.find(".//field[@showname='XXX']")
<Element 'field' at 0x108519bd0>
>>> tree.find(".//field[@showname='XXX']").get('name')
'4'
</code></pre>