Source code for exporters.export_formatter.xml_export_formatter
import six
import logging
from exporters.export_formatter.base_export_formatter import BaseExportFormatter
from exporters.utils import str_list
import collections
DEFAULT_XML_HEADER = '<?xml version="1.0" encoding="UTF-8"?>'
[docs]class XMLExportFormatter(BaseExportFormatter):
"""
This export formatter provides a way of exporting items in XML format
"""
file_extension = 'xml'
supported_options = {
'attr_type': {'type': bool, 'default': True},
'fields_order': {'type': str_list, 'default': []},
'item_name': {'type': six.string_types, 'default': 'item'},
'root_name': {'type': six.string_types, 'default': 'root'},
'xml_header': {'type': six.string_types, 'default': DEFAULT_XML_HEADER}
}
def __init__(self, *args, **kwargs):
super(XMLExportFormatter, self).__init__(*args, **kwargs)
self.attr_type = self.read_option('attr_type')
self.item_name = self.read_option('item_name')
self.root_name = self.read_option('root_name')
self.xml_header = self.read_option('xml_header')
self.fields_order = self._get_fields()
def _get_fields(self):
fields = self.read_option('fields_order')
return {key: idx for idx, key in enumerate(fields)}
[docs] def format_header(self):
if self.xml_header:
return '{}\n<{}>\n'.format(self.xml_header, self.root_name)
return '<{}>\n'.format(self.root_name)
[docs] def format(self, item):
import dicttoxml
dicttoxml.LOG.setLevel(logging.WARNING)
fields_len = len(self.fields_order)
ordered_item = collections.OrderedDict(
sorted(item.items(),
key=lambda kv: self.fields_order.get(kv[0], fields_len))
)
return '<{0}>{1}</{0}>'.format(
self.item_name, dicttoxml.dicttoxml(ordered_item, root=False,
attr_type=self.attr_type))