Return 来自 xml 树迭代器的结果

Return result from xml tree iterator

我有一棵 xml 树:

<root>
    <expression>
        <add>
            <number>1</number>
            <number>2</number>
            <number>3</number>
        </add>
    </expression>
</root>

我的函数遍历树,添加子文本的整数。 print 语句的最终结果是我需要的结果,但是我如何从 addleafnodes 函数中 return 它?

root = etree.XML(request.data['expression'])
results = 0

def addleafnodes(root, results):
    for child in root:
        if root.tag != "root" and root.tag != "expression":
            results += int(child.text)
        print(results)
        addleafnodes(child, results)

newresults = addleafnodes(root, results)

您将 results 传递给递归并递增,但绝不会 return 返回 "up"。如果 results 是一个对象,而你只是传递一个引用,你可以在 root-call 到 addleafnodes 之后查看它。

以下将 return 求和支持递归:

from xml.etree.ElementTree import XML

expr = """<root>
    <expression>
        <add>
            <number>1</number>
            <number>2</number>
            <number>3</number>
        </add>
    </expression>
</root>
"""
root = XML(expr)

def addleafnodes(root, results):
    for child in root:
        if root.tag != "root" and root.tag != "expression":
            results += int(child.text)
        results = addleafnodes(child, results)
    return results

newresults = addleafnodes(root, 0)
print(newresults)

我认为这种函数式方法很好,但您也可以简单地从递归内部更新全局变量(我已从此代码段中删除了 results = 0)。

请注意,我不确定代码是否会破坏更深层的表达式结构(例如嵌套添加等)。

您的问题已标记为 lxml。如果你真的使用 lxml 你可以使用 sum() xpath 函数来简化...

from lxml import etree

expr = """<root>
    <expression>
        <add>
            <number>1</number>
            <number>2</number>
            <number>3</number>
        </add>
    </expression>
</root>
"""

root = etree.fromstring(expr)


def addleafnodes(elem):
    return int(elem.xpath("sum(.//add/number)"))


newresults = addleafnodes(root)
print(newresults)

打印输出...

6

还有see here for more info on xpath in lxml.