xmlclass/xmlclass.py
changeset 116 58b9b84e385f
parent 92 76d5001393df
child 119 564564136c79
equal deleted inserted replaced
115:017a65259f07 116:58b9b84e385f
    29 from new import classobj
    29 from new import classobj
    30 
    30 
    31 """
    31 """
    32 Regular expression models for extracting dates and times from a string
    32 Regular expression models for extracting dates and times from a string
    33 """
    33 """
    34 time_model = re.compile('([0-9]{2}):([0-9]{2}):([0-9]{2}(?:.[0-9]*)?)')
    34 time_model = re.compile('([0-9]{2}):([0-9]{2}):([0-9]{2}(?:\.[0-9]*)?)(?:Z)?')
    35 date_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})')
    35 date_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})((?:[\-\+][0-9]{2}:[0-9]{2})|Z)?')
    36 datetime_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})[ T]([0-9]{2}):([0-9]{2}):([0-9]{2}(?:.[0-9]*)?)')
    36 datetime_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})[ T]([0-9]{2}):([0-9]{2}):([0-9]{2}(?:\.[0-9]*)?)((?:[\-\+][0-9]{2}:[0-9]{2})|Z)?')
       
    37 
       
    38 class xml_timezone(tzinfo):
       
    39 
       
    40     def SetOffset(self, offset):
       
    41         if offset == "Z":
       
    42             self.__offset = timedelta(minutes = 0)
       
    43             self.__name = "UTC"
       
    44         else:
       
    45             sign = {"-" : -1, "+" : 1}[offset[0]]
       
    46             hours, minutes = [int(val) for val in offset[1:].split(":")]
       
    47             self.__offset = timedelta(minutes = sign * (hours * 60 + minutes))
       
    48             self.__name = ""
       
    49 
       
    50     def utcoffset(self, dt):
       
    51         return self.__offset
       
    52 
       
    53     def tzname(self, dt):
       
    54         return self.__name
       
    55 
       
    56     def dst(self, dt):
       
    57         return ZERO
    37 
    58 
    38 XSD_INTEGER_TYPES = ["integer","nonPositiveInteger","negativeInteger","long",
    59 XSD_INTEGER_TYPES = ["integer","nonPositiveInteger","negativeInteger","long",
    39     "int","short","byte","nonNegativeInteger","unsignedLong","unsignedInt",
    60     "int","short","byte","nonNegativeInteger","unsignedLong","unsignedInt",
    40     "unsignedShort","unsignedByte","positiveInteger"]
    61     "unsignedShort","unsignedByte","positiveInteger"]
    41 
    62 
   107         else:
   128         else:
   108             raise ValueError, "\"%s\" is not a valid time!"%value
   129             raise ValueError, "\"%s\" is not a valid time!"%value
   109     elif type_compute == "date":
   130     elif type_compute == "date":
   110         result = date_model.match(value)
   131         result = date_model.match(value)
   111         if result:
   132         if result:
   112             date_values = [int(v) for v in result.groups()]
   133             values = result.groups()
       
   134             date_values = [int(v) for v in values[:3]]
       
   135             if values[3] is not None:
       
   136                 tz = xml_timezone()
       
   137                 tz.SetOffset(values[3])
       
   138                 date_values.append(tz)
   113             return date(*date_values)
   139             return date(*date_values)
   114         else:
   140         else:
   115             raise ValueError, "\"%s\" is not a valid date!"%value
   141             raise ValueError, "\"%s\" is not a valid date!"%value
   116     elif type_compute == "dateTime":
   142     elif type_compute == "dateTime":
   117         result = datetime_model.match(value)
   143         result = datetime_model.match(value)
   118         if result:
   144         if result:
   119             values = result.groups()
   145             values = result.groups()
   120             datetime_values = [int(v) for v in values[:5]]
   146             datetime_values = [int(v) for v in values[:5]]
   121             seconds = float(values[5])
   147             seconds = float(values[5])
   122             datetime_values.extend([int(seconds), int((seconds % 1) * 1000000)])
   148             datetime_values.extend([int(seconds), int((seconds % 1) * 1000000)])
       
   149             if values[6] is not None:
       
   150                 tz = xml_timezone()
       
   151                 tz.SetOffset(values[6])
       
   152                 datetime_values.append(tz)
   123             return datetime(*datetime_values)
   153             return datetime(*datetime_values)
   124         else:
   154         else:
   125             raise ValueError, "\"%s\" is not a valid datetime!"%value
   155             raise ValueError, "\"%s\" is not a valid datetime!"%value
   126     else:
   156     else:
   127         print "Can't affect: %s"%type_compute
   157         print "Can't affect: %s"%type_compute
   636                             val.loadXMLTree(attr)
   666                             val.loadXMLTree(attr)
   637                         setattr(self, attrname, val)
   667                         setattr(self, attrname, val)
   638             
   668             
   639             # Load the node childs if they are defined in the list
   669             # Load the node childs if they are defined in the list
   640             for node in tree.childNodes:
   670             for node in tree.childNodes:
       
   671                 if node.nodeType == node.COMMENT_NODE:
       
   672                     continue
   641                 name = node.nodeName
   673                 name = node.nodeName
   642                 # We make fun of #text elements
   674                 # We make fun of #text elements
   643                 if name != "#text":
   675                 if name != "#text":
   644                     
   676                     
   645                     # Class has an attribute that can have different value types
   677                     # Class has an attribute that can have different value types