`

XML解析(SAX解析)

阅读更多

1. SAX的基本原理及常用的接口

    * Simple API for XML,对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)的开始与结束时会通知事件处理函数,由事件处理函数做相应的动作,然后继续扫描,知道文档结束。

    * SAX的常用接口

        - ContentHandler接口,位于org.xml.sax下。当XML解析器开始解析XML输入文档时,它会遇到诸如文档的开头和结束、元素的开头和结束以及原色中的字符数据等事件,XML解析器会调用Contenthandler接口中相应的方法来响应该事件。

    * 特点

        - 优点: 适合查询

        - 缺点: 不适合插入元素和删除元素

    * 代码示例

        - SaxParseTest.java

package sax1;

import javax.xml.parsers.*;

import org.xml.sax.*;

import org.xml.sax.helpers.*;

import java.io.*;

/**
 * Title: 使用SAX解析XML
 */

public class SaxTestHandler extends DefaultHandler {
	public static void main(String[] argv) {
		try {
			// 建立SAX解析工厂
			SAXParserFactory spfactory = SAXParserFactory.newInstance();
			// 生成SAX解析对象
			SAXParser parser = spfactory.newSAXParser();
			// 指定XML文件,进行XML解析
			parser.parse(new File("src/book.xml"), new SaxTestHandler());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 方法说明:文件打开时调用
	 */
	public void startDocument() {
		System.out.println("***开始解析***");
	}
	/**
	 * 方法说明:当遇到开始标记时调用
	 */
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		System.out.println("节点开始:" + qName);
		for (int i = 0; i < attributes.getLength(); i++) {
			System.out.println("节点属性名称:" + attributes.getQName(i));
			System.out.println("节点属性值:" + attributes.getValue(i));
		}
	}
	/**
	 * 方法说明:当分析器遇到无法识别为标记或者指令类型字符时调用
	 */
	public void characters(char[] ch, int offset, int length)
			throws SAXException {
		System.out.println("节点数据:" + new String(ch, offset, length));
	}
	/**
	 * 方法说明:当遇到节点结束时调用
	 */

	public void endElement(String uri, String localName, String qName) {
		System.out.println("节点结束:" + qName);
	}
	/**
	 * 方法说明:当到文档的末尾调用
	 */
	public void endDocument() {
		System.out.println("****文件解析完毕****");
	}

}

         - xml文件

<?xml version="1.0" encoding="GBK" ?>  
<book>  
  <title>Java实例一百例</title>  
  <page id="1">  
    <title>基础知识篇</title>  
    <file>base.htm</file>  
  </page>  
  <page id="3">  
    <title>SWING篇</title>  
    <file>swing.htm</file>  
  </page>  
  <page id="28">  
    <title>EJB篇</title>  
    <file>ejb.htm</file>  
  </page>  
  <page id="33">  
    <title>DOM篇</title>  
    <file>xmldom.htm</file>  
  </page>  
</book>  

 

    * 两种方式读取xml文件

        - 读文件方式

            见上例。

        - 读取xml字符串

//reader方式
	public static void sax_reader() {
		FileOperate fo = new FileOperate();
		String path = SaxTest.class.getResource("").getPath();
		String xmls;
		try {
			xmls = fo.readTxt(path + "../book.xml", "");

			SAXParserFactory factory = SAXParserFactory.newInstance();
			XMLReader reader;

			reader = factory.newSAXParser().getXMLReader();
			reader.setContentHandler(new SaxTestHandler());
			reader.parse(new InputSource(new StringReader(xmls)));
		} catch (Exception e1) {
			e1.printStackTrace();
		}
	}
 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics