1ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistpackage com.android.hotspot2.osu; 2ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 3ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport com.android.hotspot2.omadm.XMLNode; 4ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 5ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport org.xml.sax.Attributes; 6ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport org.xml.sax.InputSource; 7ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport org.xml.sax.SAXException; 8ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport org.xml.sax.helpers.DefaultHandler; 9ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 10ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.io.BufferedReader; 11ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.io.IOException; 12ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.io.InputStream; 13ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.io.InputStreamReader; 14ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.nio.charset.StandardCharsets; 15ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 16ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport javax.xml.parsers.ParserConfigurationException; 17ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport javax.xml.parsers.SAXParser; 18ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport javax.xml.parsers.SAXParserFactory; 19ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 20ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistpublic class XMLParser extends DefaultHandler { 21ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final SAXParser mParser; 22ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final InputSource mInputSource; 23ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 24ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private XMLNode mRoot; 25ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private XMLNode mCurrent; 26ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 27ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public XMLParser(InputStream in) throws ParserConfigurationException, SAXException { 28ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mParser = SAXParserFactory.newInstance().newSAXParser(); 29ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mInputSource = new InputSource(new BufferedReader( 30ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist new InputStreamReader(in, StandardCharsets.UTF_8))); 31ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 32ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 33ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public XMLNode getRoot() throws SAXException, IOException { 34ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mParser.parse(mInputSource, this); 35ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return mRoot; 36ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 37ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 38ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 39ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public void startElement(String uri, String localName, String qName, Attributes attributes) 40ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist throws SAXException { 41ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist XMLNode parent = mCurrent; 42ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 43ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mCurrent = new XMLNode(mCurrent, qName, attributes); 44ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist //System.out.println("Added " + mCurrent.getTag() + ", atts " + mCurrent.getAttributes()); 45ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 46ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (mRoot == null) 47ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mRoot = mCurrent; 48ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist else 49ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist parent.addChild(mCurrent); 50ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 51ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 52ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 53ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public void endElement(String uri, String localName, String qName) throws SAXException { 54ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (!qName.equals(mCurrent.getTag())) 55ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist throw new SAXException("End tag '" + qName + "' doesn't match current node: " + 56ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mCurrent); 57ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 58ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist try { 59ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mCurrent.close(); 60ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } catch (IOException ioe) { 61ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist throw new SAXException("Failed to close element", ioe); 62ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 63ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 64ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mCurrent = mCurrent.getParent(); 65ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 66ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 67ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 68ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public void characters(char[] ch, int start, int length) throws SAXException { 69ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mCurrent.addText(ch, start, length); 70ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 71ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist} 72