http://blog.csdn.net/sunboy_2050/article/details/7521598
1. sax概述
sax是一种占用内存少且解析速度快的解析器,它采用的是事件启动,不需要解析完整个文档,而是按照内容顺序看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些方法 定义在contenthandler中,下面是其主要方法:
startdocument():当遇到文档的时候就触发这个事件 调用这个方法 可以在其中做些预处理工作,如:申请对象资源
enddocument():当结束文档的时候就触发这个事件 调用这个方法 可以在其中做些善后工作,如:释放申请的对象资源
startelement(string namespaceuri, string localname, string qname, attributes atts):当遇开始标签的时候就会触发这个方法。
endelement(string uri, string localname, string name):当遇到结束标签时触发这个事件,调用此法可以做些善后工作。
charachers(char [] ch, int start, int length):当遇到xml内容时触发这个方法,用new string(ch,start,length)可以接受内容。
sax方式创建xml,应用了标准xml构造器 javax.xml.transform.sax.transformerhandler 事件来创建 xml 文档,需要导入以下内容
javax.xml.transform
javax.xml.transform.sax.saxtransformerfactory; javax.xml.transform.sax.transformerhandler; javax.xml.transform.transformer; javax.xml.transform.transformerconfigurationexception; javax.xml.transform.transformerfactoryconfigurationerror; javax.xml.transform.outputkeys; javax.xml.transform.stream.streamresult;
javax.xml.parsers
javax.xml.parsers.saxparser; javax.xml.parsers.saxparserfactory; javax.xml.parsers.factoryconfigurationerror; javax.xml.parsers.parserconfigurationexception;
org.xml.sax
org.xml.sax.attributes; org.xml.sax.saxexception; org.xml.sax.helpers.attributesimpl; org.xml.sax.helpers.defaulthandler;
sdk源码查看路径(google code)
sax 创建和解析 xml 的效果图:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yM3AjMfJjN0ADN3UzMzEzLcBzMvwFNwITMwIzLcNHZh9GbwV3LcRXZu5ibkN3YukXbvw1LcpDc0RHaiojIsJye.png)
2、sax 创建 xml
首先,saxtransformerfactory.newinstance() 创建一个工厂实例 factory
接着,factory.newtransformerhandler() 获取 transformerhandler 的 handler 对象
然后,通过 handler 事件创建handler.gettransformer()、 handler.setresult(result),以及 startdocument()、startelement、characters、endelement、enddocument()等
code
[java] view
plaincopyprint?
/** sax方式,创建 xml */
public string saxcreatexml(){
stringwriter xmlwriter = new stringwriter();
person []persons = new person[3]; // 创建节点person对象
persons[0] = new person(1, "sunboy_2050", "http://blog.csdn.net/sunboy_2050");
persons[1] = new person(2, "baidu", "http://www.baidu.com");
persons[2] = new person(3, "google", "http://www.google.com");
try {
saxtransformerfactory factory = (saxtransformerfactory)saxtransformerfactory.newinstance();
transformerhandler handler = factory.newtransformerhandler();
transformer transformer = handler.gettransformer(); // 设置xml属性
transformer.setoutputproperty(outputkeys.indent, "yes");
transformer.setoutputproperty(outputkeys.encoding, "utf-8");
transformer.setoutputproperty(outputkeys.version, "1.0");
streamresult result = new streamresult(xmlwriter); // 保存创建的xml
handler.setresult(result);
handler.startdocument();
attributesimpl attr = new attributesimpl();
attr.clear();
attr.addattribute("", "", "author", "", "homer");
attr.addattribute("", "", "date", "", "2012-04-27");
handler.startelement("", "", "root", attr);
int personslen = persons.length;
for(int i=0; i<personslen; i++){
attr.clear();
handler.startelement("", "", "person", attr);
handler.startelement("", "", "id", attr);
string id = persons[i].getid() + "";
handler.characters(id.tochararray(), 0, id.length());
handler.endelement("", "", "id");
handler.startelement("", "", "name", attr);
string name = persons[i].getname();
handler.characters(name.tochararray(), 0, name.length());
handler.endelement("", "", "name");
handler.startelement("", "", "blog", attr);
string blog = persons[i].getblog();
handler.characters(blog.tochararray(), 0, blog.length());
handler.endelement("", "", "blog");
handler.endelement("", "", "person");
}
handler.endelement("", "", "root");
handler.enddocument();
} catch (transformerfactoryconfigurationerror e) { // saxtransformerfactory.newinstance
e.printstacktrace();
} catch (transformerconfigurationexception e) { // factory.newtransformerhandler
} catch (illegalargumentexception e) { // transformer.setoutputproperty
} catch (saxexception e) { // handler.startdocument
} catch (exception e) {
}
savedxml(filename, xmlwriter.tostring());
return xmlwriter.tostring();
}
运行结果:
3、sax解析xml
/** sax方式,解析 xml */
public string saxresolvexml(){
stringwriter xmlwriter = new stringwriter();
inputstream is = readxml(filename);
try {
saxparserfactory factory = saxparserfactory.newinstance();
saxparser saxparser = factory.newsaxparser();
personhandler handler = new personhandler(); // person处理handler
saxparser.parse(is, handler); // handler解析xml
// 获取解析的xml
string xmlheader = handler.getxmlheader();
xmlwriter.append(xmlheader);
list<person> personslist = handler.getpersons();
int personslen = personslist.size();
for(int i=0; i<personslen; i++){
xmlwriter.append(personslist.get(i).tostring()).append("\n");
}
} catch (factoryconfigurationerror e) { // saxparserfactory.newinstance
e.printstacktrace();
} catch (parserconfigurationexception e) { // factory.newsaxparser
} catch (saxexception e) { // factory.newsaxparser
} catch (illegalargumentexception e) { // saxparser.parse
} catch (ioexception e) { // saxparser.parse
} catch (exception e) {
return xmlwriter.tostring();
/** handler处理类 */
private final class personhandler extends defaulthandler{
private list<person> personslist = null; // 保存person
private person person = null;
private stringbuffer xmlheader; // 保存xml头部信息
private string tag = null; // xml element
/** 返回解析的xml头部信息 */
public string getxmlheader(){
return xmlheader.tostring();
/** 返回解析的person实例数组 */
public list<person> getpersons(){
return personslist;
@override
public void startdocument() throws saxexception{
super.startdocument();
personslist = new arraylist<person>();
xmlheader = new stringbuffer();
public void startelement(string uri, string localname, string qname, attributes attributes) throws saxexception{
super.startelement(uri, localname, qname, attributes);
if("root".equals(localname)) {
string attrauthor = attributes.getvalue(0);
string attrdate = attributes.getvalue(1);
xmlheader.append("root").append("\t\t");
xmlheader.append(attrauthor).append("\t");
xmlheader.append(attrdate).append("\n");
} else if("person".equals(localname)) {
person = new person();
}
tag = localname;
public void characters(char[] ch, int start, int length) throws saxexception {
super.characters(ch, start, length);
if (null != tag) {
string value = new string(ch, start, length);
system.out.println("value = " + value);
if ("id".equals(tag)) {
person.setid(new integer(value));
} else if ("name".equals(tag)) {
person.setname(value);
} else if ("blog".equals(tag)) {
person.setblog(value);
}
public void endelement(string uri, string localname, string qname) throws saxexception {
if("person".equals(qname)) {
personslist.add(person);
person = null;
tag = null;
super.endelement(uri, localname, qname);
public void enddocument() throws saxexception{
// personslist = null;
super.enddocument();