递归没有python

时间:2014-08-05 12:38:00

标签: python recursion elementtree

这是一个XML解析器代码片段,返回None值。这是一个大型XML文件,有很多这样的子字段:

<root>
    <field name ="1">
        <field name ="2" showname ="ZZZ">
            <field name ="3" showname="YYY">
                <field name ="4" showname="XXX"/>
            </field>
        </field>
    </field>

findall()查找带有标记的所有元素,这些元素是当前元素的直接子元素。我尝试了这个,但它返回时没有。它也没有打印。

def findXXX(field):
    if field.get('name') == 'XXX' :
        return field.get('showname')
    else:
        for fieldchild in field.findall('field'):
            return findXXX(fieldchild)

如果我这样写,它会打印正确的值,但是返回时为无。

def findXXX(field):
    if field.get('name') == 'XXX' :
        print field.get('showname')
        return field.get('showname')
    else:
        for fieldchild in field.findall('field'):
            findXXX(fieldchild)

2 个答案:

答案 0 :(得分:0)

在第二个版本中,您忽略递归调用的返回值。您的第一个版本至少仍返回该返回值:

for fieldchild in field.findall('field'):
    return findXXX(fieldchild)

函数中的return语句返回直接调用者,而不是findXXX()最外面的第一次调用的调用者。

但是现在只有field列表中 first field.findall()的结果才会返回。您可能希望返回第一个而不是None

for fieldchild in field.findall('field'):
    result = findXXX(fieldchild)
    if result is not None:
        return result

这会对每个field元素进行递归搜索,并返回 first 这样的非None递归调用的结果。

请注意,您 无法递送;你也可以使用XPath expression来搜索树而不必自己回复:

field.find(".//field[@showname='XXX']")

这会返回第一个field标记,其name属性设置为XXX递归搜索

演示:

>>> 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'

答案 1 :(得分:0)

我建议您使用BeautifulSoup。它易于学习,具有良好的文档。 http://www.crummy.com/software/BeautifulSoup/bs4/doc/

可以使用下面的代码实例化汤对象,其中“markup”是包含XML的字符串,或XML文件的输入文件句柄:

BeautifulSoup(markup, "xml")