def parse_inner(inner_els, element): """ Delegate the parsing of a subelement to another function. For example, given the element: <element> <subelement> <a>Foo</a><b>Bar</b> </subelement> </element> and a dictionary {'subelement': parse_subelement}, call parse_subelement(<subelement>) and return a dict {'subelement': <result>} if parse_subelement returns a tuple of the form ('subelement-key', <result>) then return a dict {'subelement-key': <result>} instead """ result = {} for sub in element: t = fixtag(sub.tag, NS_MAP)[0] if ":" in t: t = t.split(":")[1] if t in inner_els.keys(): inner_result = inner_els[t](sub) if isinstance(inner_result, tuple): result[inner_result[0]] = inner_result[1] else: result[t] = inner_result else: _log.debug("in <%s>, not delegating <%s>", fixtag(element.tag, NS_MAP)[0], t) return result
def parse_elements(valid_els, inner_els, element): """ Extract single level subelements from an element. For example, given the element: <element> <subelement>Text</subelement> </element> and a list valid_els that contains "subelement", return a dict {'subelement': 'Text'} Delegate the parsing of multi-level subelements to another function. For example, given the element: <element> <subelement> <a>Foo</a><b>Bar</b> </subelement> </element> and a dictionary {'subelement': parse_subelement}, call parse_subelement(<subelement>) and return a dict {'subelement': <result>} if parse_subelement returns a tuple of the form (True, {'subelement-key': <result>}) then merge the second element of the tuple into the result (which may have a key other than 'subelement' or more than 1 key) """ result = {} for sub in element: t = fixtag(sub.tag, NS_MAP)[0] if ":" in t: t = t.split(":")[1] if t in valid_els: result[t] = sub.text or "" elif t in inner_els.keys(): inner_result = inner_els[t](sub) if isinstance(inner_result, tuple) and inner_result[0]: result.update(inner_result[1]) else: result[t] = inner_result # add counts for lists when available m = re.match(r'([a-z0-9-]+)-list', t) if m and "count" in sub.attrib: result["%s-count" % m.group(1)] = int(sub.attrib["count"]) else: _log.info("in <%s>, uncaught <%s>", fixtag(element.tag, NS_MAP)[0], t) return result
def parse_attributes(attributes, element): """ Extract attributes from an element. For example, given the element: <element type="Group" /> and a list attributes that contains "type", return a dict {'type': 'Group'} """ result = {} for attr in element.attrib: if "{" in attr: a = fixtag(attr, NS_MAP)[0] else: a = attr if a in attributes: result[a] = element.attrib[attr] else: _log.info("in <%s>, uncaught attribute %s", fixtag(element.tag, NS_MAP)[0], attr) return result
def parse_elements(valid_els, element): """ Extract single level subelements from an element. For example, given the element: <element> <subelement>Text</subelement> </element> and a list valid_els that contains "subelement", return a dict {'subelement': 'Text'} """ result = {} for sub in element: t = fixtag(sub.tag, NS_MAP)[0] if ":" in t: t = t.split(":")[1] if t in valid_els: result[t] = sub.text or "" else: _log.debug("in <%s>, uncaught <%s>", fixtag(element.tag, NS_MAP)[0], t) return result
def parse_relation_attribute_element(element): # Parses an attribute into a dictionary containing an element # {"attribute": <text value>} and also an additional element # containing any xml attributes. # e.g <attribute value="BuxWV 1">number</attribute> # -> {"attribute": "number", "value": "BuxWV 1"} result = {} for attr in element.attrib: if "{" in attr: a = fixtag(attr, NS_MAP)[0] else: a = attr result[a] = element.attrib[attr] result["attribute"] = element.text return result
def parse_medium_list(ml): """medium-list results from search have an additional <track-count> element containing the number of tracks over all mediums. Optionally add this""" medium_list = [] track_count = None for m in ml: tag = fixtag(m.tag, NS_MAP)[0] if tag == "ws2:medium": medium_list.append(parse_medium(m)) elif tag == "ws2:track-count": track_count = int(m.text) ret = {"medium-list": medium_list} if track_count is not None: ret["medium-track-count"] = track_count return (True, ret)
def parse_inner(inner_els, element): """ Delegate the parsing of a subelement to another function. For example, given the element: <element> <subelement> <a>Foo</a><b>Bar</b> </subelement> </element> and a dictionary {'subelement': parse_subelement}, call parse_subelement(<subelement>) and return a dict {'subelement': <result>} """ result = {} for sub in element: t = fixtag(sub.tag, NS_MAP)[0] if ":" in t: t = t.split(":")[1] if t in inner_els.keys(): result[t] = inner_els[t](sub) return result