|
6 | 6 | from __future__ import print_function
|
7 | 7 |
|
8 | 8 | import logging
|
| 9 | +import re |
9 | 10 |
|
10 | 11 | import numpy as np
|
11 | 12 |
|
|
14 | 15 | log.addHandler(logging.StreamHandler())
|
15 | 16 |
|
16 | 17 |
|
| 18 | +def _without_namespace(tagname): |
| 19 | + """Remove the xml namespace from a tag name.""" |
| 20 | + if '}' in tagname: |
| 21 | + return tagname.rsplit('}', 1)[-1] |
| 22 | + return tagname |
| 23 | + |
| 24 | + |
17 | 25 | class _Types(object):
|
18 | 26 | @staticmethod
|
19 | 27 | def handle_typed_values(val, type_name, value_type):
|
@@ -69,16 +77,14 @@ def handle_typed_values(val, type_name, value_type):
|
69 | 77 | """
|
70 | 78 | if value_type in ['byte', 'short', 'int', 'long']:
|
71 | 79 | try:
|
72 |
| - val = val.split() |
73 |
| - val = list(map(int, val)) |
| 80 | + val = [int(v) for v in re.split('[ ,]', val) if v] |
74 | 81 | except ValueError:
|
75 |
| - log.warning('Cannot convert %s to int. Keeping type as str.', val) |
| 82 | + log.warning('Cannot convert "%s" to int. Keeping type as str.', val) |
76 | 83 | elif value_type in ['float', 'double']:
|
77 | 84 | try:
|
78 |
| - val = val.split() |
79 |
| - val = list(map(float, val)) |
| 85 | + val = [float(v) for v in re.split('[ ,]', val) if v] |
80 | 86 | except ValueError:
|
81 |
| - log.warning('Cannot convert %s to float. Keeping type as str.', val) |
| 87 | + log.warning('Cannot convert "%s" to float. Keeping type as str.', val) |
82 | 88 | elif value_type == 'boolean':
|
83 | 89 | try:
|
84 | 90 | # special case for boolean type
|
@@ -191,6 +197,14 @@ def handle_featureDataset(element): # noqa
|
191 | 197 | def handle_variable(self, element):
|
192 | 198 | return self.handle_grid(element)
|
193 | 199 |
|
| 200 | + def lookup(self, handler_name): |
| 201 | + handler_name = 'handle_' + _without_namespace(handler_name) |
| 202 | + if handler_name in dir(self): |
| 203 | + return getattr(self, handler_name) |
| 204 | + else: |
| 205 | + msg = 'cannot find handler for element {}'.format(handler_name) |
| 206 | + log.warning(msg) |
| 207 | + |
194 | 208 |
|
195 | 209 | class NCSSDataset(object):
|
196 | 210 | """Hold information contained in the dataset.xml NCSS document.
|
@@ -245,7 +259,6 @@ def __init__(self, element):
|
245 | 259 |
|
246 | 260 | """
|
247 | 261 | self._types = _Types()
|
248 |
| - self._types_methods = _Types.__dict__ |
249 | 262 |
|
250 | 263 | self.gridsets = {}
|
251 | 264 | self.variables = {}
|
@@ -279,12 +292,7 @@ def __init__(self, element):
|
279 | 292 | delattr(self, thing)
|
280 | 293 |
|
281 | 294 | def _get_handler(self, handler_name):
|
282 |
| - handler_name = 'handle_' + handler_name |
283 |
| - if handler_name in self._types_methods: |
284 |
| - return getattr(self._types, handler_name) |
285 |
| - else: |
286 |
| - msg = 'cannot find handler for element {}'.format(handler_name) |
287 |
| - log.warning(msg) |
| 295 | + return self._types.lookup(handler_name) |
288 | 296 |
|
289 | 297 | def _parse_element(self, element):
|
290 | 298 | element_name = element.tag
|
|
0 commit comments