您好,欢迎访问一九零五行业门户网

详解对XML进行Sax解析的示例代码分享

对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解析的示例代码分享的详细内容。
其它类似信息

推荐信息