def dlcs_parse_xml(data, split_tags=False): if DEBUG>3: print ("dlcs_parse_xml: parsing from ", data, file=sys.stderr) if not hasattr(data, 'read'): data = StringIO(data) doc = parse_xml(data) root = doc.getroot() fmt = root.tag # Split up into three cases: Data, Result or Update if fmt in ('tags', 'posts', 'dates', 'bundles'): elist = [el.attrib for el in doc.findall(fmt[:-1])] data = {fmt: elist} data.update(root.attrib) return data elif fmt == 'result': if root.attrib.has_key('code'): msg = root.attrib['code'] else: msg = root.text v = msg in DLCS_OK_MESSAGES return {fmt: (v, msg)} elif fmt == 'update': return {fmt: {'time':time.strptime(root.attrib['time'], ISO_8601_DATETIME)}} else: raise PyDeliciousException ( "Unknown XML document format '%s'" % fmt)
def dlcs_parse_xml(data, split_tags=False): """Parse any del.icio.us XML document and return Python data structure. Recognizes all XML document formats as returned by the version 1 API and translates to a JSON-like data structure (dicts 'n lists). Returned instance is always a dictionary. Examples:: {'posts': [{'url':'...','hash':'...',},],} {'tags':['tag1', 'tag2',]} {'dates': [{'count':'...','date':'...'},], 'tag':'', 'user':'******'} {'result':(True, "done")} # etcetera. """ if DEBUG > 3: print("dlcs_parse_xml: parsing from ", data, file=sys.stderr) if not hasattr(data, 'read'): data = StringIO(data) doc = parse_xml(data) root = doc.getroot() fmt = root.tag # Split up into three cases: Data, Result or Update if fmt in ('tags', 'posts', 'dates', 'bundles'): # Data: expect a list of data elements, 'resources'. # Use `fmt` (without last 's') to find data elements, elements # don't have contents, attributes contain all the data we need: # append to list elist = [el.attrib for el in doc.findall(fmt[:-1])] # Return list in dict, use tagname of rootnode as keyname. data = {fmt: elist} # Root element might have attributes too, append dict. data.update(root.attrib) return data elif fmt == 'result': # Result: answer to operations if 'code' in root.attrib: msg = root.attrib['code'] else: msg = root.text # Return {'result':(True, msg)} for /known/ O.K. messages, # use (False, msg) otherwise v = msg in DLCS_OK_MESSAGES return {fmt: (v, msg)} elif fmt == 'update': # Update: "time" #return {fmt: root.attrib} return { fmt: { 'time': time.strptime(root.attrib['time'], ISO_8601_DATETIME) } } else: raise PyDeliciousException("Unknown XML document format '%s'" % fmt)
def dlcs_parse_xml(data, split_tags=False): """Parse any del.icio.us XML document and return Python data structure. Recognizes all XML document formats as returned by the version 1 API and translates to a JSON-like data structure (dicts 'n lists). Returned instance is always a dictionary. Examples:: {'posts': [{'url':'...','hash':'...',},],} {'tags':['tag1', 'tag2',]} {'dates': [{'count':'...','date':'...'},], 'tag':'', 'user':'******'} {'result':(True, "done")} # etcetera. """ if DEBUG>3: print("dlcs_parse_xml: parsing from ", data, file=sys.stderr) if not hasattr(data, 'read'): data = StringIO(data) doc = parse_xml(data) root = doc.getroot() fmt = root.tag # Split up into three cases: Data, Result or Update if fmt in ('tags', 'posts', 'dates', 'bundles'): # Data: expect a list of data elements, 'resources'. # Use `fmt` (without last 's') to find data elements, elements # don't have contents, attributes contain all the data we need: # append to list elist = [el.attrib for el in doc.findall(fmt[:-1])] # Return list in dict, use tagname of rootnode as keyname. data = {fmt: elist} # Root element might have attributes too, append dict. data.update(root.attrib) return data elif fmt == 'result': # Result: answer to operations if 'code' in root.attrib: msg = root.attrib['code'] else: msg = root.text # Return {'result':(True, msg)} for /known/ O.K. messages, # use (False, msg) otherwise v = msg in DLCS_OK_MESSAGES return {fmt: (v, msg)} elif fmt == 'update': # Update: "time" #return {fmt: root.attrib} return {fmt: {'time':time.strptime(root.attrib['time'], ISO_8601_DATETIME)}} else: raise PyDeliciousException("Unknown XML document format '%s'" % fmt)