1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
from typing import Dict, List, Optional, Type
from xsdata.exceptions import XmlContextError
from xsdata.formats.dataclass.parsers.mixins import XmlNode
from xsdata.formats.dataclass.parsers.utils import ParserUtils
from xsdata.models.enums import DataType
class StandardNode(XmlNode):
"""
XmlNode for any type elements with a standard xsi:type.
:param datatype: Standard xsi data type
:param ns_map: Namespace prefix-URI map
:param nillable: Specify whether the node supports nillable content
:param derived_factory: Optional derived element factory
"""
__slots__ = "datatype", "ns_map", "nillable", "derived_factory"
def __init__(
self,
datatype: DataType,
ns_map: Dict,
nillable: bool,
derived_factory: Optional[Type],
):
self.datatype = datatype
self.ns_map = ns_map
self.nillable = nillable
self.derived_factory = derived_factory
def bind(
self, qname: str, text: Optional[str], tail: Optional[str], objects: List
) -> bool:
obj = ParserUtils.parse_value(
value=text,
types=[self.datatype.type],
ns_map=self.ns_map,
format=self.datatype.format,
)
if obj is None and not self.nillable:
obj = ""
if self.datatype.wrapper:
obj = self.datatype.wrapper(obj)
if self.derived_factory:
obj = self.derived_factory(qname=qname, value=obj)
objects.append((qname, obj))
return True
def child(self, qname: str, attrs: Dict, ns_map: Dict, position: int) -> XmlNode:
raise XmlContextError("Primitive node doesn't support child nodes!")
|