带DTD 的XML 用SAX进行解析

来源:互联网 发布:贝尔狂虐伊莲娜 知乎 编辑:程序博客网 时间:2024/06/05 10:05

    我们知道,在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>



 

原创粉丝点击