XML-SAX解析
SAX解析:
Simple Api for XML (xml简单处理API),提供了一种基于事件的XML的解析方式
多用于快速读取XML文档
基于事件驱动,在内存中并不会加载整个文档,效率要高(解析大型XML文档)
不能重复读取 顺序读取模式
1.得到工厂实例
SAXParserFactory actory=SAXParserFactory.newInstance();
2.由工厂实例 得到 解析器
SAXParser parser=factory.newSAXParser();
3.解析器 parse (File f,MyHandler extends DefaultHandler dh)
Class MyHandler extends DefaultHandler{
public void …
}
SAX解析属性:
Atttibutes接口中的各个成员及其功能:
getLength:标记属性的个数
getURL:名称空间的URL,如果没有则为空字符串
getLocaName:本地名称,如果没有执行名称空间处理工作就是空字符串
getQName:XML1.o的首先名
getType:用字符串表示的属性类型,属性类型是DTD中支持的各种类型之一
getValue:使用字符表示的属性
getIntdex:属性的索引
SAX解析实例:
测试流程
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.*;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import org.xml.sax.Attributes;
//使用SAX方式解析XML文档
public class s1{
public static void main(String[] agrs)throws Exception{
//**** 使用 SAXParser.parse() 处理文件
//1、得到工厂的实例 使用static 方法newInstance();
SAXParserFactory factory=SAXParserFactory.newInstance();
//2、使用工厂实例 得到解析器 newSAXParser();
SAXParser parser=factory.newSAXParser();
//3、使用SAXParser.parse() 处理文件
parser.parse(new File("s1.xml"),new MyHandler());
}
}
//文档处理器 其中定义了很多回调方法 按照要求 重写方法
class MyHandler extends DefaultHandler{
//文件开始的时候调用的方法
@Override
public void startDocument() throws SAXException{
System.out.println("文档开始。。。");
}
//元素开始时调用的方法
@Override
public void startElement(String uri,String localName,String qName,Attributes attrs ) throws SAXException{
System.out.println("元素开始。。。");
}
@Override
public void characters(char[] ch,int start,int length)throws SAXException{
System.out.println("字符数据。。。");
}
public void endElement(String uri,String localName,String qName,Attributes attrs ) throws SAXException{
System.out.println("元素结束。。。");
}
@Override
public void endDocument() throws SAXException{
System.out.println("文档结束。。。");
}
}
.遍历文档
----------Student.xml------------
<?xml version="1.0" encoding="GBK"?>
<students>
<student id="1">
<name>zhangsan</name>
<age>12</age>
<address>jinan</address>
</student>
<student id="2">
<name>lisi</name>
<age>23</age>
<address>shandong</address>
</student>
</students>
----------MySax.java:----------
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.*;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import org.xml.sax.Attributes;
//使用SAX方式解析XML文档 完整遍历过程
public class MySax{
public static void main(String args[])throws Exception{
//1.得到工厂的实例 使用static 方法newInstance();
SAXParserFactory factory=SAXParserFactory.newInstance();
//2.使用工厂实例 得到 解析器 newSAXParser();
SAXParser parser=factory.newSAXParser();
// 使用 SAXParser.parse()处理文件
parser.parse(new File("student.xml"),new MyHandler());
}
}
//文档处理器 其中定义了很多回调方法 按照需求 重写方法
class MyHandler extends DefaultHandler{
StringBuffer str=new StringBuffer("");
//文档开始的时候调用的方法
@Override
public void startDocument() throws SAXException{
str.append("<?xml version=\"1.0\" encoding=\"GBK\"?>\n");
}
//元素开始的时候调用的方法
@Override
public void startElement(String uri,String localName,
String qName,Attributes attrs) throws SAXException{
str.append("<"+qName);//拼装元素的开始标记
//如果有属性 则遍历得到
for(int i=0;i<attrs.getLength();i++){
//得到属性名字
String att_name=attrs.getQName(i);
//属性值
String att_value=attrs.getValue(i);
str.append(" "+att_name+"=\""+att_value+"\"");
}
str.append(">");
}
@Override
public void characters(char[] ch,int start,int length)
throws SAXException{
str.append(new String(ch,start,length));
}
@Override
public void endElement(String uri,String localName,String qName)
throws SAXException{
str.append("</").append(qName).append(">");
}
@Override
public void endDocument()throws SAXException{
System.out.println(str.toString());
}
}