Broncode voor kerapu.shredder.Shredder

import csv
from typing import List

from lxml.etree import Element

from kerapu.style.KerapuStyle import KerapuStyle


[documentatie]class Shredder: """ Klasse voor het schreden van XML-bestanden en opslaan in CSV-formaat. """ # ------------------------------------------------------------------------------------------------------------------ def __init__(self, io: KerapuStyle, target_dir: str): """ Object constructor. :param str target_dir: De folder waar de CSV-bestanden moeten worden opgeslagen. """ self._io: KerapuStyle = io """ The output decorator. """ self.__target_dir: str = target_dir """ De folder waar de CSV-bestanden moeten worden opgeslagen. """ # ------------------------------------------------------------------------------------------------------------------
[documentatie] @staticmethod def extract_field(element: Element, tag: str) -> str: """ Extracts de waarde van een XML element. :param Element element: Het parent XML element. :param str tag: De tag van het gevraagde XML-element. :rtype: str """ elements = element.xpath(tag, namespaces={'soapenv': 'http://schemas.xmlsoap.org/soap/envelope/'}) if elements: return elements[0].text return ''
# ------------------------------------------------------------------------------------------------------------------
[documentatie] def extract_table(self, table: Element, filename: str, fields: List, xpaths: List) -> None: """ Extracts een groupertabel uit XML een slaat de tabel op in een CSV-bestand. :param Element table: De naam van de groupertabel. :param str filename: De filenaam van het CSV-bestaand. :param list fields: Een lijst met velden (d.w.z. kolomen in het CSV-bestand). :param list xpaths: Een lijst met xpath voor het extracten van de bovenstaande velden. """ # Sanity test. if len(fields) != len(xpaths): raise ValueError("fields and xpaths must have equal length") # Open the file and create CSV writer. file = open(self.__target_dir + '/' + filename, 'w', encoding='utf-8') writer = csv.writer(file) # Write header row. writer.writerow(fields) # Write all rows in the XML 'table'. row_count = 0 for element in table: row = [] for xpath in xpaths: row.append(Shredder.extract_field(element, xpath)) writer.writerow(row) row_count += 1 # Close the file. file.close() self._io.text('Wrote {:6d} rows to <fso>{}</fso>'.format(row_count, filename))
# ----------------------------------------------------------------------------------------------------------------------