要解析的persons.xml文件內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1">
<name>張三</name>
<age>34</age>
</person>
<person id ="2">
<name>李四</name>
<age>24</age>
</person>
</persons>
程序代碼文件MyHandler.java
public class MyHandler extends DefaultHandler {
private HashMap<String, String> map = null;//存儲單個解析的完整對象
private List<HashMap<String,String>> list =null;//存儲所有的解析對象
private String currentTag = null;//正在解析的元素的標籤
private String currentValue = null;//解析當前元素的值
private String nodeName = null;//解析當前的節點名稱
public MyHandler(String nodeName) {
// TODO Auto-generated constructor stub
this.nodeName = nodeName;
}
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
//當讀到第一個開始標籤的時候,會觸發這個方法
//System.out.println("當讀到第一個開始標籤的時候,會觸發這個方法");
list = new ArrayList<HashMap<String,String>>();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//System.out.println("當遇到文檔的開頭的時候,調用這個方法");
//當遇到文檔的開頭的時候,調用這個方法
//System.out.println("qName="+qName +" nodeName="+nodeName);
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;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//System.out.println("這個方法是用來處理xml文件所讀取到的內容");
//這個方法是用來處理xml文件所讀取到的內容
if(currentTag!=null&&map!=null){
currentValue = new String(ch,start,length);
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 {
//System.out.println("遇到結束標記的時候,會調用這個方法");
//遇到結束標記的時候,會調用這個方法
if(qName.equals(nodeName)){
list.add(map);
map = null;
}
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
}
public List<HashMap<String,String>> getList() {
return list;
}
saxService.java
public class saxService {
public saxService() {
// TODO Auto-generated constructor stub
}
public static List<HashMap<String,String>> readXML(InputStream inputStream,String nodeName){
System.out.println("進入readXML");
List<HashMap<String,String>> list =null;
try {
//創建一個解析xml的工廠對象
//會對XML文件的每一個字符逐一讀取並出發相應事件
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser parser = spf.newSAXParser();//解析xml
MyHandler handler = new MyHandler(nodeName);
parser.parse(inputStream, handler);
inputStream.close();
return handler.getList();
} catch (Exception e) {
// TODO: handle exception
}
return list;
}
}
HttpUtils.java
public class HttpUtils {
public HttpUtils() {
// TODO Auto-generated constructor stub
}
public static InputStream getXML(String path){
System.out.println("進到httpUtils");
InputStream inputStream = null;
try {
URL url = new URL(path);
System.out.println("url="+url.toString());
if(url != null){
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(3000);//延時時間3秒
connection.setDoInput(true);// 設置是否從httpUrlConnection讀入,默認情況下是true;
connection.setRequestMethod("GET");
int code = connection.getResponseCode();//驗證連接服務器是否成功,沒有密碼時,返回200爲成功,有密碼時返回401爲成功
System.out.println("code="+code);
if(code == 200){
inputStream = connection.getInputStream();
}
}
} catch (Exception e) {
// TODO: handle exception
}
return inputStream;
}
}
測試類Test.java
public class Test {
public Test() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String path="http://chinese-1c71864:8080/android_sax_xml/person.xml";
//連接服務器,取回xml文件內容
InputStream inputStream = HttpUtils.getXML(path);
try {
//
List<HashMap<String,String>> list = saxService.readXML(inputStream, "person");
//遍歷循環讀書list裏的內容
for(HashMap<String,String> map : list){
System.out.println(map.toString());
}
} catch (Exception e) {
// TODO: handle exception
}
}
}