您的位置:首页 > 移动开发 > Android开发

android使用sax解析xml

2015-12-27 14:38 615 查看
新建一个类继承DefaultHandler

package com.sax.handler;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyHandler2 extends DefaultHandler {
private String currentTag=null;
private String currentValue=null;
private String nodeName=null;
private HashMap<String, String> map=null;
private List<HashMap<String, String>> list=null;

public List<HashMap<String, String>> getList() {
return list;
}

public MyHandler2(String nodeName) {
// TODO Auto-generated constructor stub
this.nodeName=nodeName;
}

@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
list=new ArrayList<HashMap<String,String>>();
}

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
if (qName!=null && !qName.equals("")&&qName.equals(nodeName)) {
map=new HashMap<String, String>();
}
currentTag=qName;
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
if (map!=null && currentTag!=null ) {
currentValue=new String(ch, start, length);
if (currentValue!=null && !currentValue.equals("")
&&!currentValue.startsWith("\n")) {
map.put(currentTag, currentValue);
}
}
currentTag=null;
currentValue=null;
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
if (qName!=null&&qName.equals(nodeName)) {
list.add(map);
}
}

}


一个HttpUtils2类

package com.sax.http;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class HttpUtils2 {

public HttpUtils2() {
// TODO Auto-generated constructor stub
}
public InputStream getXML(String path){
InputStream inputStream=null;
URL url;
try {
url = new URL(path);
HttpURLConnection httpUrlConnection=(HttpURLConnection) url.openConnection();
httpUrlConnection.setConnectTimeout(3000);
httpUrlConnection.setRequestMethod("GET");
if (httpUrlConnection.getResponseCode()==200) {
inputStream=httpUrlConnection.getInputStream();

}

} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return inputStream;
}

}


一个SaxService2类

package com.sax.service;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

import com.sax.handler.MyHandler2;
import com.sun.org.apache.xerces.internal.parsers.SAXParser;

public class SaxService2 {

public SaxService2() {
// TODO Auto-generated constructor stub
}
public List<HashMap<String, String>> parseXML(InputStream is,MyHandler2 dh){
List<HashMap<String, String>> list=null;
SAXParserFactory factory=SAXParserFactory.newInstance();
try {
javax.xml.parsers.SAXParser saxParser=factory.newSAXParser();
saxParser.parse(is, dh);
list=dh.getList();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}

}


测试类
package com.sax.test;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;

import com.sax.handler.MyHandler2;
import com.sax.http.HttpUtils2;
import com.sax.service.SaxService2;

public class Test2 {

public Test2() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
System.out.println("My test....");
SaxService2 service=new SaxService2();
MyHandler2 hd=new MyHandler2("person");
HttpUtils2 util=new HttpUtils2();
String path = "http://127.0.0.1:8080/person.xml";
InputStream inputStream=util.getXML(path);
List<HashMap<String, String>> list=service.parseXML(inputStream, hd);
for (HashMap<String, String> hashMap : list) {
System.out.println(hashMap.toString());
}
}
}


把如下xml文件放到tomcat中,就可以就行测试读取xml文件了

<?xml version="1.0" encoding="GBK"?>
<persons>
<person>
<id>23</id>
<name>张三</name>
<age>30</age>
</person>
<person>
<id>20</id>
<name>李四</name>
<age>25</age>
</person>
</persons>

使用SAX的优点是:
因为SAX的优势是流的方式处理,当遇到一个标签的时候,并不会记录下当前所碰到的标签。
也就是说,startEelment方法中,你所知道的信息,仅仅是当前的签名的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元素与其他结构相关的信息,都是不知道的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: