From bbdb1c010476d037a0ed5ea4875f78ea0f5ab456 Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Thu, 10 Nov 2011 12:49:01 -0500 Subject: [PATCH] making add() and get() more useful --- sfa/rspecs/elements/element.py | 54 +++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/sfa/rspecs/elements/element.py b/sfa/rspecs/elements/element.py index 2b27d9e5..f388995c 100644 --- a/sfa/rspecs/elements/element.py +++ b/sfa/rspecs/elements/element.py @@ -2,22 +2,54 @@ class Element(dict): fields = {} - def __init__(self, fields={}, element=None): + def __init__(self, fields={}, element=None, keys=None): self.element = element - dict.__init__(self, self.fields) - self.update(fields) + dict.__init__(self, self.fields) + if not keys: + keys = fields.keys() + for key in keys: + if key in fields: + self[key] = fields[keys] @staticmethod - def get(element_class, xml, xpath, namespaces=None): + def get(xml, xpath, element_class=Element, fields=None): + """ + Search the specifed xml node for elements that match the + specified xpath query. + Returns a list of objectes instanced by the specfied element_class. + """ + if not fields: + fields = element_class.fields.keys() elems = xml.xpath(xpath, namespaces) + objs = [] + for elem in elems: + if not fields: + obj = element_class(elem.attrib, elem) + else: + obj = element_class({}, elem) + for field in fields: + if field in elem.attrib: + obj[field] = elem.attrib[field] + objs.append(obj) generic_elems = [element_class(elem.attrib, elem) for elem in elems] - return generic_elems + return objs @staticmethod - def add(xml, element_class, name, obj): - elem = xml.add_element(name) - for field in element_class.fields: - if field in obj and obj[field]: - elem.set(field, obj[field]) - return elem + def add(xml, name, objs, fields=None): + """ + Adds a child node to the specified xml node based on + the specified name , element class and object. + """ + if not isinstance(objs, list): + objs = [objs] + if not fields: + fields = obj.keys() + elems = [] + for obj in objs: + elem = xml.add_element(name) + for field in fields + if field in obj and obj[field]: + elem.set(field, obj[field]) + elems.append(elem) + return elems -- 2.43.0