如何使用 python lxml 根据条件迭代 XML 和求和值?
How to iterate though a XML and sum values based on a condition using python lxml?
我有以下XML。我想遍历交易列表中的所有交易并对类别 = 'income' 的金额求和。我如何使用 python 中的 lxml 执行此操作?
<TransactionList>
<Transaction>
<id>1</id>
<category>income</category>
<amount>10</amount>
</Transaction>
<Transaction>
<id>2</id>
<category>income</category>
<amount>140</amount>
</Transaction>
<Transaction>
<id>3</id>
<category>income</category>
<amount>0</amount>
</Transaction>
<Transaction>
<id>4</id>
<category>income</category>
<amount>55</amount>
</Transaction>
<Transaction>
<id>5</id>
<category>exp</category>
<amount>0</amount>
</Transaction>
<TransactionList>
如果您将代码放入文件 transactions.xml
,那么您可以使用以下代码解析上述交易列表:
from lxml import etree
context = etree.parse('transactions.xml').getroot()
total_amount = 0
for transaction in context.findall('Transaction'):
category = transaction.find('category')
amount = transaction.find('amount')
if category and category == 'income' and amount:
total_amount += int(amount.text)
由于您使用的是 lxml 并且它具有良好的 xpath 支持,因此您可以在 xpath 本身中使用 sum()
函数...
from lxml import etree
xml = """<TransactionList>
<Transaction>
<id>1</id>
<category>income</category>
<amount>10</amount>
</Transaction>
<Transaction>
<id>2</id>
<category>income</category>
<amount>140</amount>
</Transaction>
<Transaction>
<id>3</id>
<category>income</category>
<amount>0</amount>
</Transaction>
<Transaction>
<id>4</id>
<category>income</category>
<amount>55</amount>
</Transaction>
<Transaction>
<id>5</id>
<category>exp</category>
<amount>0</amount>
</Transaction>
</TransactionList>"""
tree = etree.fromstring(xml)
print(tree.xpath("sum(/TransactionList/Transaction[category='income']/amount)"))
这会打印:
205.0
我有以下XML。我想遍历交易列表中的所有交易并对类别 = 'income' 的金额求和。我如何使用 python 中的 lxml 执行此操作?
<TransactionList>
<Transaction>
<id>1</id>
<category>income</category>
<amount>10</amount>
</Transaction>
<Transaction>
<id>2</id>
<category>income</category>
<amount>140</amount>
</Transaction>
<Transaction>
<id>3</id>
<category>income</category>
<amount>0</amount>
</Transaction>
<Transaction>
<id>4</id>
<category>income</category>
<amount>55</amount>
</Transaction>
<Transaction>
<id>5</id>
<category>exp</category>
<amount>0</amount>
</Transaction>
<TransactionList>
如果您将代码放入文件 transactions.xml
,那么您可以使用以下代码解析上述交易列表:
from lxml import etree
context = etree.parse('transactions.xml').getroot()
total_amount = 0
for transaction in context.findall('Transaction'):
category = transaction.find('category')
amount = transaction.find('amount')
if category and category == 'income' and amount:
total_amount += int(amount.text)
由于您使用的是 lxml 并且它具有良好的 xpath 支持,因此您可以在 xpath 本身中使用 sum()
函数...
from lxml import etree
xml = """<TransactionList>
<Transaction>
<id>1</id>
<category>income</category>
<amount>10</amount>
</Transaction>
<Transaction>
<id>2</id>
<category>income</category>
<amount>140</amount>
</Transaction>
<Transaction>
<id>3</id>
<category>income</category>
<amount>0</amount>
</Transaction>
<Transaction>
<id>4</id>
<category>income</category>
<amount>55</amount>
</Transaction>
<Transaction>
<id>5</id>
<category>exp</category>
<amount>0</amount>
</Transaction>
</TransactionList>"""
tree = etree.fromstring(xml)
print(tree.xpath("sum(/TransactionList/Transaction[category='income']/amount)"))
这会打印:
205.0