您的位置:首页 > 其它

带DTD 的XML 用SAX进行解析

2012-05-22 11:41 197 查看
我们知道,在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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: