@@ -29,24 +29,32 @@ def to_xml(self, enc='utf-8'):
29
29
30
30
31
31
class XmlBasedHeader (FileBasedHeader , XmlSerializable ):
32
+ """ Basic wrapper around FileBasedHeader and XmlSerializable."""
32
33
pass
33
34
34
35
35
36
class XmlImageParser (object ):
36
- """ Parse XML image """
37
+ """ Base class for defining how to parse xml-based images. """
37
38
38
39
HANDLER_NAMES = ['StartElementHandler' ,
39
40
'EndElementHandler' ,
40
41
'CharacterDataHandler' ]
41
42
42
- def __init__ (self , encoding = None ):
43
+ def __init__ (self , encoding = None , buffer_size = 35000000 ):
43
44
self .encoding = encoding
45
+ self .buffer_size = buffer_size
44
46
self .img = None
45
47
46
48
def _create_parser (self ):
47
- return ParserCreate () # from xml package
49
+ """Internal function that allows subclasses to mess
50
+ with the underlying parser, if desired."""
48
51
49
- def parse (self , string = None , fname = None , fptr = None ):
52
+ parser = ParserCreate (encoding = self .encoding ) # from xml package
53
+ parser .buffer_text = True
54
+ parser .buffer_size = self .buffer_size
55
+ return parser
56
+
57
+ def parse (self , string = None , fname = None , fptr = None , buffer_size = None ):
50
58
"""
51
59
Parameters
52
60
----------
@@ -59,6 +67,11 @@ def parse(self, string=None, fname=None, fptr=None):
59
67
fptr : file pointer
60
68
open file pointer to an xml document
61
69
70
+ buffer_size: None or int, optional
71
+ size of read buffer. None gives default of 35000000 unless on python <
72
+ 2.6, in which case it is read only in the parser. In that case values
73
+ other than None cause a ValueError on execution
74
+
62
75
Returns
63
76
-------
64
77
img : XmlBasedImage
@@ -76,6 +89,10 @@ def parse(self, string=None, fname=None, fptr=None):
76
89
setattr (parser , name , getattr (self , name ))
77
90
parser .ParseFile (fptr )
78
91
92
+ if fname is not None :
93
+ fptr .close ()
94
+ self .img .set_filename (fname )
95
+
79
96
return self .img
80
97
81
98
def StartElementHandler (self , name , attrs ):
@@ -108,7 +125,7 @@ def to_file_map(self, file_map=None):
108
125
f .write (self .to_xml ())
109
126
110
127
@classmethod
111
- def from_file_map (klass , file_map ):
128
+ def from_file_map (klass , file_map , buffer_size = 35000000 ):
112
129
""" Load a Gifti image from a file_map
113
130
114
131
Parameters
@@ -119,7 +136,11 @@ def from_file_map(klass, file_map):
119
136
img : GiftiImage
120
137
Returns a GiftiImage
121
138
"""
122
- img = klass .parser ().parse (
139
+ img = klass .parser (buffer_size = buffer_size ).parse (
123
140
fptr = file_map ['image' ].get_prepare_fileobj ('rb' ))
124
- img .set_filename (file_map ['image' ].filename )
125
141
return img
142
+
143
+ @classmethod
144
+ def from_filename (klass , filename , buffer_size = 35000000 ):
145
+ file_map = klass .filespec_to_file_map (filename )
146
+ return klass .from_file_map (file_map , buffer_size = buffer_size )
0 commit comments