sax的全名为Simple api for xml 。所以相比于dom的不同点就是:dom解析需要读取所有文档内容,把所有的文档加载到内存中去。所以其在pc上还可以使用,但是在手机上这些就需要sax了,sax是一点一点的读取并且处理。所以这也是这两者 的区别,还有一点就是:sax解析是擅长读取,而你想要增删的话要用dom吧。
sax的读取还是和dom差不多的,你可以创建一个工厂:
try {
//创建一个抽象工厂类
SAXParserFactory spf = SAXParserFactory.newInstance();
//获得一个解析器
SAXParser sp = spf.newSAXParser();
//获得一个读取器
XMLReader xp = sp.getXMLReader();
//设置它的内容处理器
xp.setContentHandler(new myHandler());
//读取xml文档
xp.parse("src/book.xml");
}
catch (Exception e) {
throw new RuntimeException(e);
}
我们依旧是为了读取一个book.xml文档来处理:
那么我们可以去建一个handler来继承一个ContentHandler接口!来实现我们的东西。
class myHandler implements ContentHandler
{
//这个方法就是当你在读取到一个标签式调用,打印qName也能看的出来!
@Override
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
System.out.println("<"+qName+">");
}
//标签中的内容读取的时候会调用这个方法,ch中就是内容数组!
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch,start,length));
}
//当标签结束的时候会调用这个方法!
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("</"+qName+">");
}
.......
}
也就是说这是一个内容处理器就好比一个代理一样,当读取什么的时候,就调用哪个方法!
也就是说我们可以有很多方法调用啊!但是我们不都要 覆盖那么我们可以继承DefaultHandler来解决这一问题!
我们再来一种开发常用的方法来读取xml文件:也就是说要把xml中的打包为一个对象!也可以是bean!
package Web4Xml;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class mySax4Xml2 {
/**
* @param args
*/
public static void main(String[] args) {
createSax();
}
public static void createSax()
{
try {
//创建一个抽象工厂类
SAXParserFactory spf = SAXParserFactory.newInstance();
//获得一个解析器
SAXParser sp = spf.newSAXParser();
//获得一个读取器
XMLReader xp = sp.getXMLReader();
Handle myhand = new Handle();
//设置它的内容处理器
xp.setContentHandler(myhand);
//读取xml文档
xp.parse("src/book.xml");
List<book> list = myhand.getBook();
for(ListIterator<book> it = list.listIterator();it.hasNext();)
{
book b= it.next();
System.out.println(b.getName()+"价格是:"+b.getPrice());
}
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
}
class book
{
private String name ;
private String price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
class Handle extends DefaultHandler
{
private List<book> booklist = new ArrayList<book>();
private String currentTag;
book mybook = null;
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentTag = qName;
if(qName.equals("book"))
{
mybook = new book();
booklist.add(mybook);
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String str = new String(ch,start,length);
if("bookname".equals(currentTag))
{
mybook.setName(str);
}
if("bookprice".equals(currentTag))
{
mybook.setPrice(str);
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
currentTag = null;
if(qName.equals("book"))
{
mybook = null;
}
}
public List<book> getBook()
{
return booklist;
}
}
文中最关键是我们没有直接继承ContentHandler接口而是直接去继承了DefaultHandler(用extends继承的)!我们的用法就是为了少去覆盖方法!
好吧还有一点注意的是我们的方法:就是面向对象!把每一个元素打包为方法!