如何使用 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