Sax 解析xml
SAX,全称Simple API for XML,既是一种接口,也是一种软件包。它是一种XML解析的替代方法。SAX不同于DOM解析,它逐行扫描文档,一边扫描一边解析。由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。
SAX是一种XML解析的替代方法。相比于文档对象模型DOM,SAX 是读取和操作 XML 数据的更快速、更轻量的方法。
基于事件的API
SAX API是一个基于事件的API ,适用于处理数据流,即随着数据的流动而依次处理数据。
JDK中org.xml.sax.helpers.DefaultHandler 是SAX2 事件处理器的默认基类
DefaultHander
方法
Java中Sax解析xml
1.SaxHandler.java
package com.kanbujian.handler;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
//org.xml.sax.helpers.DefaultHandler
//别导错包
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* SAX处理类 繼承 DefaultHandler ,Default base class for SAX2 event handlers
* 基于事件,触发方法
*
* @author QT
*
*/
public class SaxHandler extends DefaultHandler {
/**
* map 保存一个xml元素的属性名和值
*/
private HashMap<String, String> map = null;
/**
* list 保存所有xml元素
*/
private ArrayList<HashMap<String, String>> list = null;
/**
* 扫描的节点的标记
*/
private String CurrentTag = null;
/**
* 扫描到的节点的值
*/
private String CurrentValue = null;
/**
* 扫描到的节点的名字
*/
private String NodeName = null;
/**
* 构造方法
*
* @param nodeName 解析的节点名称
*
*/
public SaxHandler(String nodeName) {
super();
NodeName = nodeName;
}
/**
* 返回xml元素的List集合
*
* @return xml元素的List集合
*/
public ArrayList<HashMap<String, String>> getList() {
return list;
}
/**
* 当读取到文檔时,触发这个方法
*/
@Override
public void startDocument() throws SAXException {
list = new ArrayList<HashMap<String, String>>();
}
/**
* 當讀取到第一個標簽時,觸發這個方法
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (qName.equals(NodeName)) {
map = new HashMap<String, String>();
}
if (attributes != null && map != null) {
for (int i = 0; i < attributes.getLength(); i++) {
map.put(attributes.getQName(i), attributes.getValue(i));
}
}
CurrentTag = qName;
}
/**
* 处理xml文件的内容
*/
@Override
public void characters(char[] ch, int start, int lengh) throws SAXException {
if (CurrentTag != null && map != null) {
CurrentValue = new String(ch, start, lengh);
if (CurrentValue != null & !CurrentValue.trim().equals("")
&& !CurrentValue.trim().equals("\n")) {
map.put(CurrentTag, CurrentValue);
}
}
CurrentTag = null;
CurrentValue = null;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (qName.equals(NodeName)) {
list.add(map);
map = null;
}
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}
}
2.HttpUtils.java
package com.kanbujian.http;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* http工具類
* @author QT
*
*/
public class HttpUtils {
public HttpUtils() {
// TODO Auto-generated constructor stub
}
/**
* 通過URL獲取輸入流
* @param path
* @return
*/
public static InputStream getXml(String path){
InputStream is=null;
try {
URL url=new URL(path);
if(url!=null){
//獲得HttpURLConnnection
HttpURLConnection connection =(HttpURLConnection)url.openConnection();
//設置屬性
connection.setConnectTimeout(3000);
connection.setDoInput(true);
connection.setRequestMethod("GET");
int code=connection.getResponseCode();
//GET請求成功
if(code==200){
is=connection.getInputStream();
}
}
} catch (Exception e) {
// TODO: handle exception
}
return is;
}
}
3.xmlService.java
package com.kanbujian.xmlservice;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import com.kanbujian.handler.SaxHandler;
/**
* service類
* 通過readXML靜態方法實現讀取xml的功能 *
* @author QT
*
*/
public class xmlService {
/**
* readXML()靜態方法
* @param io 輸入流
* @param nodeName 節點名
* @return 所有節點元素組成的集合
*/
public static ArrayList<HashMap<String, String>> readXML(InputStream io,String nodeName) {
List<HashMap<String, String>> list=null;
try {
//得到转换工厂
SAXParserFactory saxFactory=SAXParserFactory.newInstance();
//得到解析器
SAXParser parser=saxFactory.newSAXParser();
SaxHandler handler=new SaxHandler(nodeName);
//SAX解析
parser.parse(io, handler);
//記得關閉流
io.close();
return handler.getList();
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
}
4.text.java
package com.kanbujian.text;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import com.kanbujian.http.HttpUtils;
import com.kanbujian.xmlservice.xmlService;
public class text {
public static void main(String[] args){
String path="http://localhost:8080/jay01/user.xml";
InputStream is=HttpUtils.getXml(path);
try {
ArrayList<HashMap<String, String>> list=xmlService.readXML(is, "user");
for(HashMap<String, String> hm:list){
System.out.println(hm);
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
5.XML源文件和输出结果