递归无python

2024-09-30 04:27:25 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个返回无值的XML解析器代码段。这是一个很大的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)

Tags: name标记元素fieldgetreturnifdef
2条回答

我可以建议你用美素吗。它易学,有很好的文档。http://www.crummy.com/software/BeautifulSoup/bs4/doc/

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

BeautifulSoup(markup, "xml")

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

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

函数中的return语句返回给直接调用方,而不是最外层的第一次调用findXXX()的调用方。你知道吗

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

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

这将启动对每个field元素的递归搜索,并返回不是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'

相关问题 更多 >

    热门问题