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

互联网 17-4-1
对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文件的顺序来解析,当读入<?xml.....>时,会调用startDocument()方法,当读入<oracle>的时候,由于它是个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解析的示例代码分享的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: XML,Sax
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:详细介绍XML中的DOCTYPE字段

相关资讯