SAX(Simple API for XML简称SAX)事件是无状态的,也就是说,当接收到字符数据的事件后,并不知道该字符数据是哪一个元素的
内容。同样地,当收到元素开始的事件后,也无法知道该元素是否有父元素,是否有子元素,这是
SAX和DOM不同的地方。SAX解析器本身并不提供元素的上下文信息,所有相关信息的记录需要我们自
己编程去实现
SaxXml类加载XML数据流,(目前用字符串代替),建立解析工厂,生产SAX解析对象
import java.io.ByteArrayInputStream;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
public class SaxXml {
private SaxXml() {
}
SaxXml(String xmlFile) {
try{
String xmltest = "<?xml version=/"1.0/" encoding=/"gb2312/"?>"
+"<home>"
+"<name>张三</name>"
+"<sex>男</sex>"
+"<age>20</age>"
+"</home>";
byte[] data1 = xml.getBytes();
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
SAXParser sax = factory.newSAXParser();
sax.parse(new ByteArrayInputStream(data1), XmlHandler.handler/*new XmlHandler()*/ );
} catch (ParserConfigurationException pce) {
System.out.println("Could not create that parser.");
System.out.println(pce.getMessage());
} catch (SAXException saxe) {
System.out.println("Problem wITh the SAX parser.");
System.out.println(saxe.getMessage());
} catch (Exception e) {
e.printStackTrace();
return ;
}
}
}
ReadXml类定义XML解析出的数据结构,目前是一个简单容易上手的DEMO
class ReadXml {
String name;
String sex;
String age;
public ReadXml( ){
}
public ReadXml( String name,String sex,String age ){
this.sex = sex;
this.name = name;
this.age = age;
}
}
XmlHandler 类解析XML字符串
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.UnsupportedEncodingException;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
class XmlHandler extends DefaultHandler {
static int READING_NAME = 1;
static int READING_SEX = 2;
static int READING_AGE = 3;
static int READING_NOTHING = 0;
int currentActivity = READING_NOTHING;
public static XmlHandler handler = new XmlHandler();
ReadXml xml = new ReadXml();
XmlHandler() {
super();
}
/**
*<br>方法说明:当遇到开始标记时调用
*<br>输入参数:
*<br>返回类型:
*/
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
if (qName.equals("name")){
currentActivity = READING_NAME;
}
else if (qName.equals("sex"))
{
currentActivity = READING_SEX;
}
else if (qName.equals("age"))
{
currentActivity = READING_AGE;
}
}
/**
*<br>方法说明:当分析器遇到无法识别为标记或者指令类型字符时调用
*<br>输入参数:
*<br>返回类型:
*/
public void characters(char[] ch, int start, int length) {
String value = new String(ch, start, length);
if (currentActivity == READING_NAME){
xml.name = value;
}
if (currentActivity == READING_SEX)
{
xml.sex = value;
}
if (currentActivity == READING_AGE)
{
xml.age = value;
}
}
/**
*<br>方法说明:当遇到节点结束时调用
*<br>输入参数:
*<br>返回类型:
*/
public void endElement(String uri, String localName, String qName) {
if (qName.equals("home")) {
try {
System.out.println("/nName: "+xml.name);
System.out.println("Sex: "+xml.sex);
System.out.println("age: "+xml.age);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
xml = new ReadXml();
}
}
}