1
0
Fork 0
oarc-dsc-datatool/dsc_datatool/input/xml.py
Daniel Baumann 1ea3e103a7
Adding upstream version 1.4.2.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-04-22 13:23:23 +02:00

71 lines
2.6 KiB
Python

"""dsc_datatool.input.xml
Input plugin to generate `Dataset`'s from DSC XML files.
Part of dsc_datatool.
:copyright: 2024 OARC, Inc.
"""
import logging
from xml.dom import minidom
import base64
from dsc_datatool import Input, Dataset, Dimension, process_dataset
class XML(Input):
def process(self, file):
dom = minidom.parse(file)
datasets = []
for array in dom.getElementsByTagName('array'):
if process_dataset and not array.getAttribute('name') in process_dataset:
continue
dataset = Dataset()
dataset.name = array.getAttribute('name')
dataset.start_time = int(array.getAttribute('start_time'))
dataset.stop_time = int(array.getAttribute('stop_time'))
dimensions = [None, None]
for dimension in array.getElementsByTagName('dimension'):
if dimension.getAttribute('number') == '1':
if dimensions[0]:
logging.warning('Overwriting dimension 1 for %s' % dataset.name)
dimensions[0] = dimension.getAttribute('type')
elif dimension.getAttribute('number') == '2':
if dimensions[1]:
logging.warning('Overwriting dimension 2 for %s' % dataset.name)
dimensions[1] = dimension.getAttribute('type')
else:
logging.warning('Invalid dimension number %r for %s' % (dimension.getAttribute('number'), dataset.name))
for node1 in array.getElementsByTagName(dimensions[0]):
d1 = Dimension(dimensions[0])
d1.value = node1.getAttribute('val')
try:
if node1.getAttribute('base64'):
d1.value = base64.b64decode(d1.value).decode('utf-8')
except Exception as e:
pass
dataset.dimensions.append(d1)
d2 = Dimension(dimensions[1])
d1.dimensions.append(d2)
for node2 in node1.getElementsByTagName(dimensions[1]):
val = node2.getAttribute('val')
try:
if node2.getAttribute('base64'):
val = base64.b64decode(val).decode('utf-8')
except Exception as e:
pass
d2.values[val] = int(node2.getAttribute('count'))
datasets.append(dataset)
return datasets
import sys
if sys.version_info[0] == 3 and sys.version_info[1] == 5: # pragma: no cover
Input.__init_subclass__(XML)