def parse_child_node(self, obj, node): # If our children are inside a grouping tag, parse # that first. The presence of this is indicated by # setting an empty dict on the target object. if self.tagname: val = super(Dict,self).__get__(obj) if val is None: if node.nodeType != node.ELEMENT_NODE: return dexml.PARSE_SKIP elif node.tagName == self.tagname: self.__get__(obj) return dexml.PARSE_CHILDREN else: return dexml.PARSE_SKIP # Now we just parse each child node. tmpobj = _AttrBucket() res = self.field.parse_child_node(tmpobj, node) if res is dexml.PARSE_MORE: raise ValueError("items in a dict cannot return PARSE_MORE") if res is dexml.PARSE_DONE: items = self.__get__(obj) val = getattr(tmpobj, self.field_name) try: key = getattr(val, self.key) except AttributeError: raise dexml.ParseError("Key field '%s' required but not found in dict value" % (self.key, )) if self.unique and key in items: raise dexml.ParseError("Key '%s' already exists in dict" % (key,)) items[key] = val return dexml.PARSE_MORE else: return dexml.PARSE_SKIP
def parse_done(self, obj): items = self.__get__(obj) if self.minlength is not None and len(items) < self.minlength: raise dexml.ParseError("Field '%s': not enough items" % (self.field_name, )) if self.maxlength is not None and len(items) > self.maxlength: raise dexml.ParseError("Field '%s': too many items" % (self.field_name, ))
def parse_child_node(self,obj,node): if not self.tagname: return dexml.PARSE_SKIP if self.tagname == ".": node = node.parentNode else: if not self._check_tagname(node,self.tagname): return dexml.PARSE_SKIP vals = [] # Merge all text nodes into a single value for child in node.childNodes: if child.nodeType not in (child.TEXT_NODE,child.CDATA_SECTION_NODE): raise dexml.ParseError("non-text value node") vals.append(child.nodeValue) self.__set__(obj,self.parse_value("".join(vals))) return dexml.PARSE_DONE
def parse_value(self,val): if not self._check_restrictions(val): raise dexml.ParseError("Illegal value '%s' for restricted string (%s)." % (val, self.legal_values)) return val