package net.basilwang.config;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXParse extends DefaultHandler {
private static TAConfiguration config;
private static SAXParse saxParse;
private UrlMap urlMap;
private College college;
private boolean mark = false;// 做college节点是否开始解析的标记
private String nodeName;// 存放当前遍历的节点名称
private String parentTagName = "taconfiguration";// 存放当前遍历的节点的父节点名称
private StringBuffer strBuffer;
private enum tagName {
taconfiguration, urlmap, college, result
};
public static TAConfiguration getTAConfiguration() {
if (config == null) {
config = new TAConfiguration();
parseStart();
}
return config;
}
private SAXParse() {
nodeName = null;
parentTagName = null;
}
@Override
public void startDocument() throws SAXException {
}
@Override
public void endDocument() throws SAXException {
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
strBuffer = new StringBuffer();
try {
switch (tagName.valueOf(qName)) {
case urlmap:
urlMap = new UrlMap();
parentTagName = "urlmap";
break;
case college:
college = new College(config.urlMaps);
setCollegeBegins(true);
parentTagName = "college";
break;
case result:
urlMap.setResultNode(attributes.getValue(0),
attributes.getValue(1));
nodeName = qName;
break;
default:
break;
}
} catch (Exception e) {// 不在枚举的类型之内
nodeName = qName;
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
try {
switch (tagName.valueOf(qName)) {
case urlmap:
taconfigOrCollegeAddUrlMapNode(urlMap);
break;
case college:
config.addColleageNode(college);
parentTagName = "taconfiguration";
case result:
urlMap.addResultNode();
default:
break;
}
} catch (IllegalArgumentException e) {// 处理不存在枚举类型中的节点.
if (parentTagName == "college") {
college.addListNode(qName);
}
nodeName = null;
return;
}
nodeName = null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (nodeName != null) {
String content = new String(ch, start, length);
strBuffer.append(content);
if (parentTagName == "urlmap") {
urlMap.setProperty(nodeName, strBuffer.toString());
} else if (parentTagName == "college") {
college.setProperty(nodeName, strBuffer.toString());
}
}
}
/**
* xml文件解析开始
*
* @param saxParse
*/
public static void parseStart() {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser;
saxParse = new SAXParse();
try {
parser = factory.newSAXParser();
// InputStream input = this.getClass().getClassLoader()
// .getResourceAsStream(context.getString(
// R.xml.taconfig));
// InputSource input = new InputSource(context.getResources()
// .openRawResource(R.xml.taconfig));
InputStream input = saxParse.getClass().getClassLoader()
.getResourceAsStream("taconfig.xml");
parser.parse(input, saxParse);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// private methods
private void taconfigOrCollegeAddUrlMapNode(UrlMap urlMap) {
if (collegeNotBegins()) {// taconfig增加urlmap节点
config.addUrlMapNode(urlMap);
} else {// college增加urlmap节点
college.addUrlMapNode(urlMap);
parentTagName = "college";
}
}
private void setCollegeBegins(boolean mark) {
this.mark = mark;
}
private boolean collegeNotBegins() {
return !mark;
}
}