xmlclass/xmlclass.py
changeset 116 58b9b84e385f
parent 92 76d5001393df
child 119 564564136c79
--- 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":