Beispiel #1
0
    def build_element_node(
        self,
        clazz: Type,
        attrs: Dict,
        ns_map: Dict,
        position: int,
        derived: bool,
        xsi_type: Optional[str] = None,
    ) -> Optional[XmlNode]:

        meta = self.context.fetch(clazz, self.meta.namespace, xsi_type)

        if not meta or (meta.nillable and not ParserUtils.is_nillable(attrs)):
            return None

        return ElementNode(
            meta=meta,
            config=self.config,
            attrs=attrs,
            ns_map=ns_map,
            context=self.context,
            position=position,
            derived=derived,
            substituted=xsi_type is not None,
            mixed=self.meta.has_var(mode=FindMode.MIXED_CONTENT),
        )
Beispiel #2
0
    def build_element_node(
        self,
        clazz: Optional[Type],
        attrs: Dict,
        ns_map: Dict,
        position: int,
        derived: bool,
    ) -> Optional[XmlNode]:
        xsi_type = ParserUtils.xsi_type(attrs, ns_map)

        if clazz is None:
            if not xsi_type:
                return None

            clazz = self.context.find_type(xsi_type)
            xsi_type = None

        if clazz is None:
            return None

        is_nillable = ParserUtils.is_nillable(attrs)
        meta = self.context.fetch(clazz, self.meta.namespace, xsi_type)

        if not is_nillable and meta.nillable:
            return None

        return ElementNode(
            meta=meta,
            config=self.config,
            attrs=attrs,
            ns_map=ns_map,
            context=self.context,
            position=position,
            derived=derived,
            mixed=self.meta.has_var(mode=FindMode.MIXED_CONTENT),
        )