def visit_extension_simple_content(self, node, parent): """ <extension base = QName id = ID {any attributes with non-schema Namespace}...> Content: (annotation?, ((attribute | attributeGroup)*, anyAttribute?)) </extension> """ base_name = qname_attr(node, 'base') try: base = self.schema.get_type(base_name) if isinstance(base, xsd_types.ComplexType): children = base._children else: children = [xsd_elements.Element(None, base)] except KeyError: children = [xsd_types.UnresolvedType(base_name)] for child in node.iterchildren(): if child.tag == tags.annotation: continue item = self.process(child, node) if child.tag in (tags.attribute, ): children.append(item) return children
def visit_extension_complex_content(self, node, parent): """ <extension base = QName id = ID {any attributes with non-schema Namespace}...> Content: (annotation?, ( (group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?))) </extension> """ base_name = qname_attr(node, 'base') base_type = self._get_type(base_name) if isinstance(base_type, xsd_types.ComplexType): children = list(base_type._children) elif isinstance(base_type, xsd_types.UnresolvedType): children = [xsd_types.UnresolvedType(base_name)] else: children = [xsd_elements.Element(None, base_type)] for child in node.iterchildren(): if child.tag == tags.annotation: continue item = self.process(child, node) if child.tag == tags.group: children.extend(item) elif child.tag in (tags.choice, tags.sequence, tags.all): children.extend(item) elif child.tag in (tags.attribute, ): children.append(item) return base_type, children
def visit_element(self, node, parent): """ Definition:: <element abstract = Boolean : false block = (#all | List of (extension | restriction | substitution)) default = string final = (#all | List of (extension | restriction)) fixed = string form = (qualified | unqualified) id = ID maxOccurs = (nonNegativeInteger | unbounded) : 1 minOccurs = nonNegativeInteger : 1 name = NCName nillable = Boolean : false ref = QName substitutionGroup = QName type = QName {any attributes with non-schema Namespace}...> Content: (annotation?, ( (simpleType | complexType)?, (unique | key | keyref)*)) </element> :param node: The XML node :type node: lxml.etree._Element :param parent: The parent XML node :type parent: lxml.etree._Element """ is_global = parent.tag == tags.schema # minOccurs / maxOccurs are not allowed on global elements if not is_global: min_occurs, max_occurs = _process_occurs_attrs(node) else: max_occurs = 1 min_occurs = 1 # If the element has a ref attribute then all other attributes cannot # be present. Short circuit that here. # Ref is prohibited on global elements (parent = schema) if not is_global: # Naive workaround to mark fields which are part of a choice element # as optional if parent.tag == tags.choice: min_occurs = 0 result = self.process_reference(node, min_occurs=min_occurs, max_occurs=max_occurs) if result: return result element_form = node.get("form", self.document._element_form) if element_form == "qualified" or is_global: qname = qname_attr(node, "name", self.document._target_namespace) else: qname = etree.QName(node.get("name").strip()) children = list(node) xsd_type = None if children: value = None for child in children: if child.tag == tags.annotation: continue elif child.tag in (tags.simpleType, tags.complexType): assert not value xsd_type = self.process(child, node) if not xsd_type: node_type = qname_attr(node, "type") if node_type: xsd_type = self._get_type(node_type.text) else: xsd_type = xsd_types.AnyType() nillable = node.get("nillable") == "true" default = node.get("default") element = xsd_elements.Element( name=qname, type_=xsd_type, min_occurs=min_occurs, max_occurs=max_occurs, nillable=nillable, default=default, is_global=is_global, ) # Only register global elements if is_global: self.register_element(qname, element) return element
def visit_element(self, node, parent): """ <element abstract = Boolean : false block = (#all | List of (extension | restriction | substitution)) default = string final = (#all | List of (extension | restriction)) fixed = string form = (qualified | unqualified) id = ID maxOccurs = (nonNegativeInteger | unbounded) : 1 minOccurs = nonNegativeInteger : 1 name = NCName nillable = Boolean : false ref = QName substitutionGroup = QName type = QName {any attributes with non-schema Namespace}...> Content: (annotation?, ( (simpleType | complexType)?, (unique | key | keyref)*)) </element> """ is_global = parent.tag == tags.schema # minOccurs / maxOccurs are not allowed on global elements if not is_global: min_occurs, max_occurs = _process_occurs_attrs(node) else: max_occurs = 1 min_occurs = 1 # If the element has a ref attribute then all other attributes cannot # be present. Short circuit that here. # Ref is prohibited on global elements (parent = schema) if not is_global: result = self.process_reference(node, min_occurs=min_occurs, max_occurs=max_occurs) if result: return result element_form = node.get('form', self.schema._element_form) if element_form == 'qualified' or is_global: qname = qname_attr(node, 'name', self.schema._target_namespace) else: qname = etree.QName(node.get('name')) children = node.getchildren() xsd_type = None if children: value = None for child in children: if child.tag == tags.annotation: continue elif child.tag in (tags.simpleType, tags.complexType): assert not value xsd_type = self.process(child, node) if not xsd_type: node_type = qname_attr(node, 'type') if node_type: xsd_type = self._get_type(node_type.text) else: xsd_type = xsd_builtins.AnyType() nillable = node.get('nillable') == 'true' default = node.get('default') element = xsd_elements.Element(name=qname, type_=xsd_type, min_occurs=min_occurs, max_occurs=max_occurs, nillable=nillable, default=default, is_global=is_global) self.schema._elm_instances.append(element) # Only register global elements if is_global: self.schema.register_element(qname, element) return element