def test_parse_xsi_type(self): ele = Element("foo") self.assertIsNone(ParserUtils.parse_xsi_type(ele)) ele.set(QNames.XSI_TYPE, "foo") self.assertEqual(QName("foo"), ParserUtils.parse_xsi_type(ele)) ele = Element("foo", nsmap=dict(bar="xsdata")) ele.set(QNames.XSI_TYPE, "bar:foo") self.assertEqual(QName("xsdata", "foo"), ParserUtils.parse_xsi_type(ele))
def next_node(self, element: Element, position: int, ctx: XmlContext) -> XmlNode: """ Initialize the next node to be queued for the given starting element. Search by the given element tag for a matching variable and create the next node by the variable type. :return: The next node to be queued. :raises: XmlContextError if the element is unknown and parser config is strict. """ qname = QName(element.tag) var = self.meta.find_var(qname, FindMode.NOT_WILDCARD) if not var: var = self.meta.find_var(qname, FindMode.WILDCARD) if not var: if self.config.fail_on_unknown_properties: raise XmlContextError( f"{self.meta.qname} does not support mixed content: {qname}" ) return SkipNode(position=position) if var.clazz: xsi_type = ParserUtils.parse_xsi_type(element) meta = ctx.fetch(var.clazz, self.meta.qname.namespace, xsi_type) return ElementNode(position=position, meta=meta, config=self.config) if var.is_any_type: return WildcardNode(position=position, qname=var.qname) return PrimitiveNode(position=position, var=var)
def next_node(self, element: Element, position: int, ctx: XmlContext) -> XmlNode: qname = QName(element.tag) var = self.meta.find_var(qname, FindMode.NOT_WILDCARD) if not var: var = self.meta.find_var(qname, FindMode.WILDCARD) if not var: if self.config.fail_on_unknown_properties: raise XmlContextError( f"{self.meta.qname} does not support mixed content: {qname}" ) return SkipNode(position=position) if var.clazz: xsi_type = ParserUtils.parse_xsi_type(element) meta = ctx.fetch(var.clazz, self.meta.qname.namespace, xsi_type) return ElementNode(position=position, meta=meta, default=var.default, config=self.config) if var.is_any_type: return WildcardNode(position=position, qname=var.qname) return PrimitiveNode( position=position, types=var.types, default=var.default, tokens=var.is_tokens, )