blob: 948052c9bf8a6b4ce4f8e11199b452099218c9f2 [file] [log] [blame]
/*
* 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));
}
}