162 xml_set_object($xml, $this); |
162 xml_set_object($xml, $this); |
163 xml_set_character_data_handler($xml, 'cdata'); |
163 xml_set_character_data_handler($xml, 'cdata'); |
164 xml_set_element_handler($xml, 'tag_open', 'tag_close'); |
164 xml_set_element_handler($xml, 'tag_open', 'tag_close'); |
165 |
165 |
166 // Parse! |
166 // Parse! |
167 if (!xml_parse($xml, $data, true)) |
167 $wrapper = @is_writable(sys_get_temp_dir()) ? 'php://temp' : 'php://memory'; |
168 { |
168 if (($stream = fopen($wrapper, 'r+')) && |
169 $this->error_code = xml_get_error_code($xml); |
169 fwrite($stream, $data) && |
170 $this->error_string = xml_error_string($this->error_code); |
170 rewind($stream)) |
|
171 { |
|
172 //Parse by chunks not to use too much memory |
|
173 do |
|
174 { |
|
175 $stream_data = fread($stream, 1048576); |
|
176 if (!xml_parse($xml, $stream_data === false ? '' : $stream_data, feof($stream))) |
|
177 { |
|
178 $this->error_code = xml_get_error_code($xml); |
|
179 $this->error_string = xml_error_string($this->error_code); |
|
180 $return = false; |
|
181 break; |
|
182 } |
|
183 } while (!feof($stream)); |
|
184 fclose($stream); |
|
185 } |
|
186 else |
|
187 { |
171 $return = false; |
188 $return = false; |
172 } |
189 } |
|
190 |
173 $this->current_line = xml_get_current_line_number($xml); |
191 $this->current_line = xml_get_current_line_number($xml); |
174 $this->current_column = xml_get_current_column_number($xml); |
192 $this->current_column = xml_get_current_column_number($xml); |
175 $this->current_byte = xml_get_current_byte_index($xml); |
193 $this->current_byte = xml_get_current_byte_index($xml); |
176 xml_parser_free($xml); |
194 xml_parser_free($xml); |
177 return $return; |
195 return $return; |