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 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
}
}
}