对xml进行sax解析:
一、对xml进行sax解析:
sax解析xml是事件驱动的,安装xml的顺序一步一步进行解析的.优点不用事先调入整个文档,占用资源少,缺点是事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素.
二、实现:
1.创建一个xml文档:
<?xml version="1.0" encoding="utf-8"?>
<oracle >
<user id="1" >
<name>scott</name>
<pwd>scott</pwd>
</user>
<user id="2">
<name>sys</name>
<pwd>sys</pwd>
</user>
<user id="3">
<name>system</name>
<pwd>system</pwd>
</user>
</oracle>
2.开始解析:
package sax解析xml;
import java.io.file;
import java.io.ioexception;
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 saxparser {
public static void main(string[] args) {
// 1.实例化saxparserfactory对象
saxparserfactory factory = saxparserfactory.newinstance();
try {
// 2.创建解析器:
saxparser saxparser = factory.newsaxparser();
// 3.获取需要解析的文档,生成解析器,解析文档
file xmlfile = new file("myxml\\cb.xml");
myhandler handler = new myhandler();
// 开始解析:
saxparser.parse(xmlfile, handler);
} catch (parserconfigurationexception e) {
// todo auto-generated catch block
e.printstacktrace();
} catch (saxexception e) {
// todo auto-generated catch block
e.printstacktrace();
} catch (ioexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
}
public static class myhandler extends defaulthandler {
// 作用是来记录解析的上一个节点的名称
private string pretag = null;
private boolean ifend =false;
private string getname;
private string getpwd;
@override
public void characters(char[] ch, int start, int length)
throws saxexception {
// todo auto-generated method stub
// super.characters(ch, start, length);
if (pretag != null) {
if ("name".equals(pretag)) {
getname = new string(ch, start, length);
} else if ("pwd".equals(pretag)) {
getpwd = new string(ch, start, length);
ifend=true;
system.out.println(" <name>"+getname+"</name>");
system.out.println(" <pwd>"+getpwd+"</pwd>");
}
}
}
@override
public void enddocument() throws saxexception {
// todo auto-generated method stub
// super.enddocument();
system.out.println(" </oracle>");
system.out.println("--------------------------");
system.out.println("解析xml完毕");
}
@override
public void endelement(string uri, string localname, string qname)
throws saxexception {
// todo auto-generated method stub
if(ifend==true){
system.out.println(" </user>");
ifend=false;
}
//当一个标签解析完后,pretag设置为null;
pretag = null;
}
@override
public void startdocument() throws saxexception {
// todo auto-generated method stub
system.out.println("开始解析xml文件");
system.out.println("------------------------------");
system.out.println("<?xml version="+"\""+1.0+"\""+ "encoding="+"\""+"utf-8"+"\""+"?"+">");
system.out.println(" <oracle>");
}
@override
public void startelement(string uri, string localname, string qname,
attributes attributes) throws saxexception {
// todo auto-generated method stub
// <user id="1" >
if ("user".equals(qname)) {
string s = qname;
string s1 = attributes.getvalue(0);// id
string s2 = attributes.getlocalname(0);
//system.out.println(s + s1 + s2);
system.out.println(" <"+qname+" "+"id="+"\""+s1+"\""+">");
}
pretag = qname;
}
}
}
三、运行结果:
四、补充说明:
1.执行顺序:
由于sax解析是按照xml文件的顺序来解析,当读入2d7d637517892ce2316cecc020220e96时,会调用startdocument()方法,当读入94719323359f8605bfe4a0f96ce8d039的时候,由于它是个elementnode,所以会调用startelement(string uri, string localname, string qname, attributes attributes),当要得到oracle孩子的信息是,就会调用characters(char[] ch, int start, int length)方法。
2.内部类加static关键字:
内部类是动态的,也就是开头以public class开头。而主程序是public static class main。在java中,类中的静态方法不能直接调用动态方法。只有将某个内部类修饰为静态类,然后才能够在静态类中调用该类的成员变量与成员方法。所以在不做其他变动的情况下,最简单的解决办法是将public class改为public static class.
3.startelement(string uri, string localname, string qname,attributes attributes) 方法的参数解释:
五、总结:
今天总算把对xml的两种解析方法搞了一遍,当初老师让写,自己不写,大概写了个sax,现在都看不懂,我也是醉了,通过两种方法,我觉得sax解析比较轻便。
以上就是详解对xml进行sax解析的示例代码分享的详细内容。