带DTD 的XML 用SAX进行解析

    我们知道,在java中,解析的xml文件的插件很多,dom4j,jdom等等,但是它们都是基于dom和sax两种形式就行解析的,我们明白,dom是解析小文件的,一次性的把文件加载到内存中进行解析,sax是分步进行的,只有用到的时候,才会到硬盘上去加载xml文件,适合大文件xml解析,下面我们就来书写一下sax对xml的解析例子。

     使用过sax解析xml的朋友都知道,它需要指明一个处理类来进行xml的解析处理,为了方便,就可以直接把处理类和解析类放入同一个类中来进行

package test;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Stack;

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 SAXParse extends DefaultHandler {

	private Stack<InputStream> stack = new Stack<InputStream>();
	public void parse(String path) throws ParserConfigurationException, SAXException, IOException{
		SAXParserFactory parserFactory = SAXParserFactory.newInstance();
		parserFactory.setValidating(true);
		SAXParser parser = parserFactory.newSAXParser();
		InputStream is = SAXParse.class.getClassLoader().getResourceAsStream(path);
		if(is.available() > 0){
			stack.push(is);
		}
		URL url = SAXParse.class.getClassLoader().getResource(path);
		File file = new File(url.getFile());
		parser.parse(is, this,file.getAbsolutePath());
	}

	public void endDocument() throws SAXException {
		if(!stack.empty()){
			InputStream is = stack.pop();
			if(is != null){
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
					throw new SAXException(e.getMessage());
				}
			}
		}
	}

	public void startDocument() throws SAXException {
	}

	public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
		System.out.print("<"+name+"  ");
		for(int i = 0 ; i < attributes.getLength() ; i++){
			String qname = attributes.getQName(i);
			String value = attributes.getValue(i);
			System.out.print(qname+"=\""+value+"\" ");
		}
		System.out.println("></"+name+">");
	}
	
	
	public static void main(String[] args){
		SAXParse p = new SAXParse();
		try {
			p.parse("test/test.xml");
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}

 

dtd文件,保存为test.dtd,和test.xml保存到同一个目录下面

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT root (person*)>
<!ELEMENT person (baby*)>
<!ATTLIST person idcard ID #REQUIRED>
<!ATTLIST person name CDATA #REQUIRED>
<!ATTLIST person sex (1|0|F|M) "f">
<!ATTLIST person remark CDATA "">
<!ATTLIST baby name CDATA #REQUIRED>
<!ATTLIST baby age CDATA "0">
<!ATTLIST baby sex (1|0|F|M) "f">


xml文件test.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root SYSTEM "test.dtd" >
<root>
	<person idcard="1234567890" name="张三" remark="remark" sex="1">
		<baby name="大儿子" age="2" sex="M" />
		<baby name="二女儿" age="1" sex="F" />
	</person>
</root>



 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值