добавить целые числа во вложенные дочерние элементы XML, используя python - PullRequest
0 голосов
/ 15 мая 2018

Я получаю XML-документ со многими дочерними элементами, которые мне нужны для извлечения информации, а затем экспорта в CSV или текстовый документ, чтобы я мог импортировать их в Quickbooks. Дерево XML выглядит следующим образом:

<MODocuments>
  <MODocument>
    <Document>TX1126348</Document>
    <DocStatus>P</DocStatus>
    <DateIssued>20180510</DateIssued>
    <ApplicantName>COMPANY FRUIT &amp; VEGETABLE</ApplicantName>
    <MOLots>
      <MOLot>
        <LotID>A</LotID>
        <ProductVariety>Yellow</ProductVariety>
        <TotalPounds>15500</TotalPounds>
      </MOLot>
      <MOLot>
        <LotID>B</LotID>
        <ProductVariety>Yellow</ProductVariety>
        <TotalPounds>175</TotalPounds>
      </MOLot>
      <MOLot>
        <LotID>C</LotID>
        <ProductVariety>Yellow</ProductVariety>
        <TotalPounds>7500</TotalPounds>
      </MOLot>
      <MOLot>
        <LotID>D</LotID>
        <ProductVariety>Yellow</ProductVariety>
        <TotalPounds>300</TotalPounds>
      </MOLot>
    </MOLots>
  </MODocument>
  <MODocument>
    <Document>TX1126349</Document>
    <DocStatus>P</DocStatus>
    <DateIssued>20180511</DateIssued>
    <ApplicantName>COMPANY FRUIT &amp; VEGETABLE</ApplicantName>
    <MOLots>
      <MOLot>
        <LotID>A</LotID>
        <ProductVariety>Yellow</ProductVariety>
        <TotalPounds>25200</TotalPounds>
      </MOLot>
      <MOLot>
        <LotID>B</LotID>
        <ProductVariety>Yellow</ProductVariety>
        <TotalPounds>16800</TotalPounds>
      </MOLot>
    </MOLots>
  </MODocument>
  <MODocument>
    <Document>TX1126350</Document>
    <DateIssued>20180511</DateIssued>
    <ApplicantName>COMPANY FRUIT &amp; VEGETABLE</ApplicantName>
    <MOLots>
      <MOLot>
        <LotID>A</LotID>
        <ProductVariety>Yellow</ProductVariety>
        <TotalPounds>14100</TotalPounds>
      </MOLot>
    </MOLots>
  </MODocument>
</MODocuments>

Мне нужно извлечь TotalPounds из каждого родителя MODocument, чтобы выходные данные выглядели так: Номер ДОКУМЕНТА, ИМЯ ЗАЯВИТЕЛЯ И ОБЩИЕ ПУНДЫ суммируются для всех МОЛотов в этом одном документе.

TX1126348   COMPANY FRUIT & VEGETABLE 23475
TX1126349   COMPANY FRUIT & VEGETABLE 42000
TX1126350   COMPANY FRUIT & VEGETABLE 14100

Вот код, с которым я работаю:

import xml.etree.ElementTree as ET
tree = ET.parse('TX_959_20180514131311.xml')
root = tree.getroot()

docCert = []
docComp = []
totalPounds=[]

for MODocuments in root:
    for MODocument in MODocuments:
        docCert.append(MODocument.find('Document').text)
        docComp.append(MODocument.find('ApplicantName').text)
        for MOLots in MODocument:
            for MOLot in MOLots:
                totalPounds.append(int(MOLot.find('TotalPounds').text))

for i in range(len(docCert)):
    print(i, docCert[i],' ', docComp[i], totalPounds[i])

Это мой вывод, и я не знаю, как суммировать итоги по каждому документу .., пожалуйста, помогите.

0 TX1126348   COMPANY FRUIT & VEGETABLE 15500
1 TX1126349   COMPANY FRUIT & VEGETABLE 175
2 TX1126350   COMPANY FRUIT & VEGETABLE 7500

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

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

Пример ...

from lxml import etree
import csv

tree = etree.parse("TX_959_20180514131311.xml")

with open("output.csv", "w", newline="") as csvfile:
    csvwriter = csv.writer(csvfile, delimiter=",", quoting=csv.QUOTE_MINIMAL)
    for mo_doc in tree.xpath("/MODocuments/MODocument"):
        csvwriter.writerow([mo_doc.xpath("Document")[0].text,
                            mo_doc.xpath("ApplicantName")[0].text,
                            int(mo_doc.xpath("sum(MOLots/MOLot/TotalPounds)"))])

содержимое вывода ".csv "...

TX1126348,COMPANY FRUIT & VEGETABLE,23475
TX1126349,COMPANY FRUIT & VEGETABLE,42000
TX1126350,COMPANY FRUIT & VEGETABLE,14100

Кроме того, вы можете контролировать кавычки, разделители и т. д., записывая вывод с помощью csv.

0 голосов
/ 15 мая 2018

Похоже, что в totalPounds будет больше элементов, чем в docCert или docComp. Я думаю, вам нужно сделать что-то вроде этого:

for MODocuments in root:
    for MODocument in MODocuments:
        docCert.append(MODocument.find('Document').text)
        docComp.append(MODocument.find('ApplicantName').text)
        sub_total = 0
        for MOLots in MODocument:
            for MOLot in MOLots:
                sub_total += int(MOLot.find('TotalPounds').text)
        totalPounds.append(sub_total)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...