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
我有一棵 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