Source code for xsdata.formats.dataclass.serializers.utils

from typing import Any

from lxml.etree import Element
from lxml.etree import QName

from xsdata.formats.converter import converter
from xsdata.formats.dataclass.models.generics import Namespaces
from xsdata.models.enums import Namespace
from xsdata.models.enums import QNames


[docs]class SerializeUtils:
[docs] @staticmethod def set_attributes(element: Element, values: Any, namespaces: Namespaces): """Set multiple element attributes from the given values dictionary.""" for key, value in values.items(): SerializeUtils.set_attribute(element, key, value, namespaces)
[docs] @staticmethod def set_attribute(element: Element, key: Any, value: Any, namespaces: Namespaces): """Set element attribute from the given key and value.""" if ( value is None or (key == QNames.XSI_NIL and (element.text or len(element) > 0)) or (isinstance(value, list) and len(value) == 0) ): return key = SerializeUtils.resolve_qname(key, namespaces) value = SerializeUtils.resolve_qname(value, namespaces) element.set(key, converter.to_string(value, namespaces=namespaces))
[docs] @staticmethod def resolve_qname(value: Any, namespaces: Namespaces) -> Any: if not isinstance(value, str) or not value or value[0] != "{": return value try: qname = QName(value) namespaces.add(qname.namespace) return qname except ValueError: return value
[docs] @staticmethod def set_nil_attribute(element: Element, nillable: bool, namespaces: Namespaces): """Set element xs:nil attribute if necessary.""" if nillable and element.text is None and len(element) == 0: namespaces.add(Namespace.XSI.uri, Namespace.XSI.prefix) element.set(QNames.XSI_NIL, "true")
[docs] @staticmethod def set_text(element: Element, value: Any, namespaces: Namespaces): """Set element text optional content from the given value.""" value = converter.to_string(value, namespaces=namespaces) if isinstance(value, str) and len(value) == 0: value = None element.text = value
[docs] @staticmethod def set_tail(element: Element, value: Any, namespaces: Namespaces): """Set element tail optional content from the given value.""" value = converter.to_string(value, namespaces=namespaces) if isinstance(value, str) and len(value) == 0: value = None element.tail = value