--- 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":