I need to be able to parse large XML files for my specific application (I already had data encoded in this way and I wanted to keep it consistent).
So, my first attempt was to use getStringArray, which suffers from the problem described in the question:
String [] mDefinitions = getResources().getStringArray(R.array.definition_array);
My second attempt has the same limitations as me with getStringArray. As soon as I tried to process a larger XML file (> 500K), I got DalvikVM theft on getXml:
XmlResourceParser parser = getResources().getXml(R.xml.index); try { int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { String name = null; switch (eventType){ case XmlPullParser.START_TAG: // handle open tags break; case XmlPullParser.END_TAG: // handle close tags break; } eventType = parser.next(); } } catch (XmlPullParserException e) { throw new RuntimeException("Cannot parse XML"); } catch (IOException e) { throw new RuntimeException("Cannot parse XML"); } finally { parser.close(); }
My final solution using the SAX parser for an InputStream created from a raw resource. I can parse large XML files without crashing DalvikVM:
InputStream is = getResources().openRawResource(R.raw.index); XmlHandler myXMLHandler = new XmlHandler(); SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XMLReader xr = sp.getXMLReader(); xr.setContentHandler(myXMLHandler); xr.parse(new InputSource (is)); } catch (Exception e) { System.out.println("XML Pasing Excpetion = " + e); }
Where is XmlHandler:
public class XmlHandler extends DefaultHandler { @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
source share