diff -r 017a65259f07 -r 58b9b84e385f xmlclass/xmlclass.py --- a/xmlclass/xmlclass.py Wed Oct 24 17:40:04 2007 +0200 +++ b/xmlclass/xmlclass.py Fri Oct 26 10:25:01 2007 +0200 @@ -31,9 +31,30 @@ """ Regular expression models for extracting dates and times from a string """ -time_model = re.compile('([0-9]{2}):([0-9]{2}):([0-9]{2}(?:.[0-9]*)?)') -date_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})') -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]*)?)') +time_model = re.compile('([0-9]{2}):([0-9]{2}):([0-9]{2}(?:\.[0-9]*)?)(?:Z)?') +date_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})((?:[\-\+][0-9]{2}:[0-9]{2})|Z)?') +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)?') + +class xml_timezone(tzinfo): + + def SetOffset(self, offset): + if offset == "Z": + self.__offset = timedelta(minutes = 0) + self.__name = "UTC" + else: + sign = {"-" : -1, "+" : 1}[offset[0]] + hours, minutes = [int(val) for val in offset[1:].split(":")] + self.__offset = timedelta(minutes = sign * (hours * 60 + minutes)) + self.__name = "" + + def utcoffset(self, dt): + return self.__offset + + def tzname(self, dt): + return self.__name + + def dst(self, dt): + return ZERO XSD_INTEGER_TYPES = ["integer","nonPositiveInteger","negativeInteger","long", "int","short","byte","nonNegativeInteger","unsignedLong","unsignedInt", @@ -109,7 +130,12 @@ elif type_compute == "date": result = date_model.match(value) if result: - date_values = [int(v) for v in result.groups()] + values = result.groups() + date_values = [int(v) for v in values[:3]] + if values[3] is not None: + tz = xml_timezone() + tz.SetOffset(values[3]) + date_values.append(tz) return date(*date_values) else: raise ValueError, "\"%s\" is not a valid date!"%value @@ -120,6 +146,10 @@ datetime_values = [int(v) for v in values[:5]] seconds = float(values[5]) datetime_values.extend([int(seconds), int((seconds % 1) * 1000000)]) + if values[6] is not None: + tz = xml_timezone() + tz.SetOffset(values[6]) + datetime_values.append(tz) return datetime(*datetime_values) else: raise ValueError, "\"%s\" is not a valid datetime!"%value @@ -638,6 +668,8 @@ # Load the node childs if they are defined in the list for node in tree.childNodes: + if node.nodeType == node.COMMENT_NODE: + continue name = node.nodeName # We make fun of #text elements if name != "#text":