/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.net.wifi.hotspot2.omadm; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import android.text.TextUtils; import java.io.IOException; import java.io.StringReader; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; /** * Class for parsing an XML string to an XML tree represented by {@link XMLNode}. * * The original XML string: * <root> * <tag1>text1</tag1> * <tag2> * <tag3>text3</tag3> * </tag2> * </root> * * The XML tree representation: * [root] * | * | * [tag1, text1]-----|-----[tag2] * | * | * [tag3, text3] * * @hide */ public class XMLParser extends DefaultHandler { private XMLNode mRoot = null; private XMLNode mCurrent = null; public XMLNode parse(String text) throws IOException, SAXException { if (TextUtils.isEmpty(text)) { throw new IOException("XML string not provided"); } // Reset pointers. mRoot = null; mCurrent = null; try { SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); parser.parse(new InputSource(new StringReader(text)), this); return mRoot; } catch (ParserConfigurationException pce) { throw new SAXException(pce); } } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { XMLNode parent = mCurrent; mCurrent = new XMLNode(parent, qName); if (mRoot == null) { mRoot = mCurrent; } else if (parent == null) { throw new SAXException("More than one root nodes"); } else { parent.addChild(mCurrent); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (!qName.equals(mCurrent.getTag())) { throw new SAXException("End tag '" + qName + "' doesn't match current node: " + mCurrent); } mCurrent.close(); mCurrent = mCurrent.getParent(); } @Override public void characters(char[] ch, int start, int length) throws SAXException { mCurrent.addText(new String(ch, start, length)); } }