Source code for xsdata.formats.dataclass.serializers.writers.native

from typing import Dict
from typing import TextIO
from xml.sax.saxutils import XMLGenerator

from xsdata.formats.dataclass.serializers.config import SerializerConfig
from xsdata.formats.dataclass.serializers.mixins import XmlWriter


[docs]class XmlEventWriter(XmlWriter): """ :class:`~xsdata.formats.dataclass.serializers.mixins.XmlWriter` implementation based on native python. Based on the native python :class:`xml.sax.saxutils.XMLGenerator` with support for indentation. Converts sax events directly to xml output without storing intermediate result to memory. :param config: Configuration instance :param output: Output text stream :param ns_map: User defined namespace prefix-URI map """ __slots__ = ("current_level", "pending_end_element") def __init__(self, config: SerializerConfig, output: TextIO, ns_map: Dict): """ :param config: Configuration instance :param output: Output text stream :param ns_map: User defined namespace prefix-URI map """ super().__init__(config, output, ns_map) self.current_level = 0 self.pending_end_element = False self.handler = XMLGenerator( out=self.output, encoding=self.config.encoding, short_empty_elements=True )
[docs] def start_tag(self, qname: str): super().start_tag(qname) if self.config.pretty_print: if self.current_level: self.handler.ignorableWhitespace("\n") self.handler.ignorableWhitespace(" " * self.current_level) self.current_level += 1 self.pending_end_element = False
[docs] def end_tag(self, qname: str): if not self.config.pretty_print: super().end_tag(qname) return self.current_level -= 1 if self.pending_end_element: self.handler.ignorableWhitespace("\n") self.handler.ignorableWhitespace(" " * self.current_level) super().end_tag(qname) self.pending_end_element = True if not self.current_level: self.handler.ignorableWhitespace("\n")