Как перебрать хотя бы XML и суммировать значения на основе условия, используя python lxml? - PullRequest
0 голосов
/ 26 января 2019

У меня есть следующий XML. Я хочу пройти все транзакции в списке транзакций и суммировать суммы, где категория = 'доход'. Как мне сделать это с помощью lxml в python?

<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> 

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Поскольку вы используете lxml и он имеет хорошую поддержку xpath, вы можете использовать функцию sum() в самом xpath ...

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
0 голосов
/ 26 января 2019

Если вы поместите свой код в файл 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)
...