def bind_element_children( cls, params: Dict, meta: XmlMeta, position: int, objects: List, ): """Return a dictionary of qualified object names and their values for the given queue item.""" while len(objects) > position: qname, value = objects.pop(position) arg = meta.find_var(qname, FindMode.NOT_WILDCARD) or meta.find_var( qname, FindMode.WILDCARD ) if not arg: raise ParserError("Impossible exception!") if not arg.init: continue if value is None: value = "" if not cls.bind_element_param(params, arg, value): lookup = QName(value.qname) if isinstance(value, AnyElement) else qname wild = cls.find_eligible_wildcard(meta, lookup, params) if not wild: logger.warning("Unassigned parsed object %s", qname) else: cls.bind_element_wildcard_param(params, wild, qname, value)
def bind_element_wild_text(cls, params: Dict, meta: XmlMeta, element: Element): """ Extract the text and tail content and bind it accordingly in the params dictionary. - var is a list prepend the text and append the tail. - var is present in the params assign the text and tail to the generic object. - Otherwise bind the given element to a new generic object. """ var = meta.find_var(mode=FindMode.WILDCARD) if not var: return txt, tail = cls.element_text_and_tail(element) if not txt and not tail: return if var.is_list: if var.name not in params: params[var.name] = [] if txt: params[var.name].insert(0, txt) if tail: params[var.name].append(tail) elif var.name in params: params[var.name].text = txt params[var.name].tail = tail else: params[var.name] = cls.parse_any_element(element, False)
def bind_element_text(cls, params: Dict, metadata: XmlMeta, element: Element): """Add the given element's text content if any to the params dictionary with the text var name as key.""" var = metadata.find_var(mode=FindMode.TEXT) if var and element.text is not None and var.init: params[var.name] = cls.parse_value( var.types, element.text, var.default, element.nsmap, var.is_tokens )
def bind_objects(cls, params: Dict, meta: XmlMeta, position: int, objects: List): """Return a dictionary of qualified object names and their values for the given queue item.""" while len(objects) > position: qname, value = objects.pop(position) arg = meta.find_var(qname, FindMode.ELEMENT) if arg and cls.bind_var(params, arg, value): continue arg = meta.find_var(qname, FindMode.WILDCARD) if arg and cls.bind_wild_var(params, arg, qname, value): continue logger.warning("Unassigned parsed object %s", qname)
def bind_element_attrs(cls, params: Dict, metadata: XmlMeta, element: Element): """Parse the given element's attributes and any text content and return a dictionary of field names and values based on the given class metadata.""" if not element.attrib: return wildcard = metadata.find_var(mode=FindMode.ATTRIBUTES) for key, value in element.attrib.items(): var = metadata.find_var(QName(key), FindMode.ATTRIBUTE) if var and var.name not in params: if var.init: params[var.name] = cls.parse_value( var.types, value, var.default, element.nsmap, var.is_tokens ) elif wildcard: if wildcard.name not in params: params[wildcard.name] = {} params[wildcard.name][key] = value
def bind_attrs(cls, params: Dict, metadata: XmlMeta, attrs: Dict, ns_map: Dict): """Parse the given element's attributes and any text content and return a dictionary of field names and values based on the given class metadata.""" if not attrs: return wildcard = metadata.find_var(mode=FindMode.ATTRIBUTES) if wildcard: params[wildcard.name] = {} for qname, value in attrs.items(): var = metadata.find_var(qname, FindMode.ATTRIBUTE) if var and var.name not in params: if var.init: params[var.name] = cls.parse_value(value, var.types, var.default, ns_map, var.tokens, var.format) elif wildcard: params[wildcard.name][qname] = cls.parse_any_attribute( value, ns_map)
def bind_element_wild_text(cls, params: Dict, meta: XmlMeta, element: Element): var = meta.find_var(mode=FindMode.WILDCARD) if not var: return txt, tail = cls.element_text_and_tail(element) if not txt and not tail: return if var.is_list: if var.name not in params: params[var.name] = list() if txt: params[var.name].insert(0, txt) if tail: params[var.name].append(tail) elif var.name in params: params[var.name].text = txt params[var.name].tail = tail else: params[var.name] = cls.parse_any_element(element, False)
def bind_content( cls, params: Dict, metadata: XmlMeta, txt: Optional[str], ns_map: Dict, ) -> bool: """ Add the given element's text content if any to the params dictionary with the text var name as key. Return if any data was bound. """ if txt is not None: var = metadata.find_var(mode=FindMode.TEXT) if var and var.init: params[var.name] = cls.parse_value(txt, var.types, var.default, ns_map, var.tokens) return True return False
def bind_element_text(cls, params: Dict, metadata: XmlMeta, element: Element): var = metadata.find_var(mode=FindMode.TEXT) if var and element.text is not None and var.init: params[var.name] = cls.parse_value( var.types, element.text, var.default, element.nsmap, var.is_tokens )