对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文件的顺序来解析,当读入<?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) 方法的参数解释:

 参见:

http://wenku.baidu.com/link?url=HQRIv8-OwNstyvEgcelwUxAZ3naM4INwm1ojs4MM2sHo0il2abC3EevtQt4YVPGe6-OyUr2C1YW3_Gmg3RkP5f4QDw5fHa0l0pBWQXV6U5y

 五、总结:

 今天总算把对XML的两种解析方法搞了一遍,当初老师让写,自己不写,大概写了个Sax,现在都看不懂,我也是醉了,通过两种方法,我觉得Sax解析比较轻便。

 分享一个教育视频:

http://mp.weixin.qq.com/s?__biz=MzAwNDQyNDI4OA==&mid=205092859&idx=6&sn=0bc0d23be171e00e8e4220b13d5e10d7&scene=2&from=timeline&isappinstalled=0#rd&_wv=5 

猜你喜欢

转载自cb123456.iteye.com/blog/2215202