예제 #1
0
 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
예제 #2
0
 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, ))
예제 #3
0
 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