从后台获取数据为XMl格式,就找了很多资料学习了下,
参考链接 参考链接
感谢博主:CodeYourSister!
安卓解析XMl主要通过三种方式: DOM, SAX,PULL;三种方式
其中大文件解析最好不要用 :DOM解析(文件树放在内存中,太占内存,不推荐)
SAX和Pull是基于事件驱动的;其中SAX解析方式是边下载边解析占用内存较少
package@H_404_13@ com.btzh.myxmltest;
import@H_404_13@ android.app.ProgressDialog;
import@H_404_13@ android.os.AsyncTask;
import@H_404_13@ android.support.v7.app.AppCompatActivity;
import@H_404_13@ android.os.Bundle;
import@H_404_13@ android.util.Log;
import@H_404_13@ android.view.View;
import@H_404_13@ android.widget.TextView;
import@H_404_13@ android.widget.Toast;
import@H_404_13@ org.w3c.dom.Attr;
import@H_404_13@ org.w3c.dom.Comment;
import@H_404_13@ org.w3c.dom.Document;
import@H_404_13@ org.w3c.dom.Element;
import@H_404_13@ org.w3c.dom.NamedNodeMap;
import@H_404_13@ org.w3c.dom.Node;
import@H_404_13@ org.w3c.dom.NodeList;
import@H_404_13@ org.xml.sax.Attributes;
import@H_404_13@ org.xml.sax.SAXException;
import@H_404_13@ org.xml.sax.helpers.DefaultHandler;
import@H_404_13@ org.xmlpull.v1.XmlPullParser;
import@H_404_13@ org.xmlpull.v1.XmlPullParserException;
import@H_404_13@ org.xmlpull.v1.XmlPullParserFactory;
import@H_404_13@ java.io.BufferedReader;
import@H_404_13@ java.io.ByteArrayInputStream;
import@H_404_13@ java.io.IOException;
import@H_404_13@ java.io.InputStream;
import@H_404_13@ java.io.InputStreamReader;
import@H_404_13@ java.net.HttpURLConnection;
import@H_404_13@ java.net.MalformedURLException;
import@H_404_13@ java.net.URL;
import@H_404_13@ java.util.ArrayList;
import@H_404_13@ java.util.HashMap;
import@H_404_13@ java.util.List;
import@H_404_13@ javax.xml.parsers.DocumentBuilder;
import@H_404_13@ javax.xml.parsers.DocumentBuilderFactory;
import@H_404_13@ javax.xml.parsers.ParserConfigurationException;
import@H_404_13@ javax.xml.parsers.SAXParser;
import@H_404_13@ javax.xml.parsers.SAXParserFactory;
public@H_404_13@ class@H_404_13@ MainActivity@H_404_13@ extends@H_404_13@ AppCompatActivity@H_404_13@ implements@H_404_13@ View@H_404_13@.OnClickListener@H_404_13@ {@H_404_13@
private@H_404_13@ TextView textView;
private@H_404_13@ String httpStr = "http://10.27.7.162:8080/frame/lemeeting/getinforoom"@H_404_13@;
private@H_404_13@ String httpStrtest = "https://mail.qq.com/cgi-bin/readmail?sid=344d6HuF5sEcSiJ6&mailid=ZC3331-E0L~tCfZQmW4DWU9gT9aT73&nocheckframe=true&t=attachpreviewer&select=1&selectfile=&seq="@H_404_13@;
ProgressDialog progressDialog;
String Strhttp = "\n"@H_404_13@ +
"<lemeeting> <user>user9</user> "@H_404_13@ +
"<conf_room> <conf_id>329</conf_id> <conf_name>?????</conf_name> "@H_404_13@ +
" <start_time>2017-03-31 09:48:12</start_time> "@H_404_13@ +
" <end_time>2017-04-01 09:48:12</end_time> "@H_404_13@ +
"<conf_password>202cb962ac59075b964b07152d234b70</conf_password> "@H_404_13@ +
" <group_id>1</group_id> "@H_404_13@ +
" <world_id>600122</world_id> </conf_room></lemeeting>"@H_404_13@;
@Override@H_404_13@
protected@H_404_13@ void@H_404_13@ onCreate@H_404_13@(Bundle savedInstanceState) {
super@H_404_13@.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.spyq_text);
findViewById(R.id.spyq_list_btn).setOnClickListener(this@H_404_13@);
findViewById(R.id.spyq_DOM_btn).setOnClickListener(this@H_404_13@);
findViewById(R.id.spyq_SAX_btn).setOnClickListener(this@H_404_13@);
findViewById(R.id.spyq_Pull_btn).setOnClickListener(this@H_404_13@);
progressDialog = new@H_404_13@ ProgressDialog(this@H_404_13@);
}
private@H_404_13@ void@H_404_13@ showProgressDialog@H_404_13@(){
if@H_404_13@ (null@H_404_13@!=progressDialog){
progressDialog.show();
}
}
private@H_404_13@ void@H_404_13@ DismissProgressDialog@H_404_13@(){
if@H_404_13@ (null@H_404_13@!=progressDialog){
progressDialog.dismiss();
}
}
//开启异步线程@H_404_13@
class Get_Result extends AsyncTask<String,Integer,String> {
@Override@H_404_13@
protected@H_404_13@ void@H_404_13@ onPreExecute@H_404_13@() {
super@H_404_13@.onPreExecute();
/* 设置进度条风格,风格为圆形,旋转的 */@H_404_13@
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
/* 设置ProgressDialog 标题 */@H_404_13@
progressDialog.setTitle("提示"@H_404_13@);
/* 设置ProgressDialog 提示信息 */@H_404_13@
progressDialog.setMessage("请稍后..."@H_404_13@);
/* 设置ProgressDialog 的进度条是否不明确 */@H_404_13@
progressDialog.setIndeterminate(false@H_404_13@);
/* 设置ProgressDialog 是否可以按退回按键取消 */@H_404_13@
progressDialog.setCancelable(true@H_404_13@);
showProgressDialog();
}
@Override@H_404_13@
protected@H_404_13@ String doInBackground@H_404_13@(String... params) {
String getresult = http_get(httpStr);
return@H_404_13@ getresult;
}
@Override@H_404_13@
protected@H_404_13@ void@H_404_13@ onPostExecute@H_404_13@(String s) {
super@H_404_13@.onPostExecute(s);
DismissProgressDialog();
//对异步获取的到Xml格式的数据进行解析@H_404_13@
saxParse(s);
}
}
private@H_404_13@ void@H_404_13@ saxXmlParse@H_404_13@(String XmlStr) {
InputStream inputStream = null@H_404_13@;
try@H_404_13@ {
inputStream = getResources().getAssets().open(XmlStr);
} catch@H_404_13@ (IOException e) {
e.printStackTrace();
}
if@H_404_13@(inputStream == null@H_404_13@)
return@H_404_13@;
final@H_404_13@ StringBuffer stringBuffer = new@H_404_13@ StringBuffer();
SAXParserFactory factory = SAXParserFactory.newInstance();
try@H_404_13@ {
SAXParser saxParser = factory.newSAXParser();
DefaultHandler defaultHandler = new@H_404_13@ DefaultHandler(){
//开始解析文档,即开始解析XML根元素时调用该方法@H_404_13@
@Override@H_404_13@
public@H_404_13@ void@H_404_13@ startDocument@H_404_13@() throws@H_404_13@ SAXException {
Log.d("zyr"@H_404_13@,"startDocument"@H_404_13@);
super@H_404_13@.startDocument();
}
//开始解析每个元素时都会调用该方法@H_404_13@
@Override@H_404_13@
public@H_404_13@ void@H_404_13@ startElement@H_404_13@(String uri,String localName,String qName,Attributes attributes) throws@H_404_13@ SAXException {
Log.e("zyr"@H_404_13@,"startElement "@H_404_13@ + qName);
super@H_404_13@.startElement(uri,localName,qName,attributes);
stringBuffer.append("<"@H_404_13@ + qName);
if@H_404_13@(attributes!=null@H_404_13@){
for@H_404_13@(int@H_404_13@ i=0@H_404_13@;i<attributes.getLength();i++){
stringBuffer.append(" "@H_404_13@ + attributes.getQName(i) + "="@H_404_13@ + attributes.getValue(i));
}
}
stringBuffer.append(">"@H_404_13@);
}
//解析到每个元素的内容时会调用此方法@H_404_13@
@Override@H_404_13@
public@H_404_13@ void@H_404_13@ characters@H_404_13@(char@H_404_13@[] ch,int@H_404_13@ start,int@H_404_13@ length) throws@H_404_13@ SAXException {
Log.d("zyr"@H_404_13@,"characters "@H_404_13@ + new@H_404_13@ String(ch,start,start+length));
super@H_404_13@.characters(ch,length);
stringBuffer.append(new@H_404_13@ String(ch,start+length));
}
//每个元素结束的时候都会调用该方法@H_404_13@
@Override@H_404_13@
public@H_404_13@ void@H_404_13@ endElement@H_404_13@(String uri,String qName) throws@H_404_13@ SAXException {
Log.e("zyr"@H_404_13@,"endElement "@H_404_13@ + qName);
super@H_404_13@.endElement(uri,qName);
stringBuffer.append("</"@H_404_13@ + qName + ">"@H_404_13@);
}
//结束解析文档,即解析根元素结束标签时调用该方法@H_404_13@
@Override@H_404_13@
public@H_404_13@ void@H_404_13@ endDocument@H_404_13@() throws@H_404_13@ SAXException {
Log.d("zyr"@H_404_13@,"endDocument"@H_404_13@);
super@H_404_13@.endDocument();
runOnUiThread(new@H_404_13@ Runnable() {
@Override@H_404_13@
public@H_404_13@ void@H_404_13@ run@H_404_13@() {
textView.setText(""@H_404_13@);
textView.setText(stringBuffer.toString());
}
});
}
};
saxParser.parse(inputStream,defaultHandler);
} catch@H_404_13@ (ParserConfigurationException e) {
e.printStackTrace();
} catch@H_404_13@ (SAXException e) {
e.printStackTrace();
} catch@H_404_13@ (IOException e) {
e.printStackTrace();
}
}
/*********************************SAX解析xml——start**********************************************/@H_404_13@
private@H_404_13@ String get_qName = ""@H_404_13@;
private@H_404_13@ String get_value = ""@H_404_13@;
String value = ""@H_404_13@;
private@H_404_13@ void@H_404_13@ saxParse@H_404_13@(String xmlStr) {
if@H_404_13@ (xmlStr==null@H_404_13@||""@H_404_13@.equals(xmlStr))
return@H_404_13@;
final@H_404_13@ List<HashMap<String,String>> dataLV = new@H_404_13@ ArrayList<HashMap<String,String>>();
final@H_404_13@ HashMap<String,String> tem = new@H_404_13@ HashMap<String,String>();
InputStream inputStream = new@H_404_13@ ByteArrayInputStream(xmlStr.getBytes());
if@H_404_13@(inputStream == null@H_404_13@)
return@H_404_13@;
SAXParserFactory factory = SAXParserFactory.newInstance();
try@H_404_13@ {
SAXParser saxParser = factory.newSAXParser();
DefaultHandler defaultHandler = new@H_404_13@ DefaultHandler(){
//开始解析文档,即开始解析XML根元素时调用该方法@H_404_13@
@Override@H_404_13@
public@H_404_13@ void@H_404_13@ startDocument@H_404_13@() throws@H_404_13@ SAXException {
Log.d("zyr"@H_404_13@,Attributes attributes) throws@H_404_13@ SAXException {
super@H_404_13@.startElement(uri,attributes);
}
//解析到每个元素的内容时会调用此方法@H_404_13@
@Override@H_404_13@
public@H_404_13@ void@H_404_13@ characters@H_404_13@(char@H_404_13@[] ch,int@H_404_13@ length) throws@H_404_13@ SAXException {
super@H_404_13@.characters(ch,length);
value = new@H_404_13@ String(ch,start+length);
}
//每个元素结束的时候都会调用该方法@H_404_13@
@Override@H_404_13@
public@H_404_13@ void@H_404_13@ endElement@H_404_13@(String uri,String qName) throws@H_404_13@ SAXException {
super@H_404_13@.endElement(uri,qName);
get_qName = Return_qName(qName);
get_value = Return_qName(value);
if@H_404_13@ (null@H_404_13@ == get_value ||""@H_404_13@.equals(get_value)||get_value.isEmpty()||get_value.length()<=0@H_404_13@){
}else@H_404_13@ {
tem.put(get_qName,get_value);
}
}
//结束解析文档,即解析根元素结束标签时调用该方法@H_404_13@
@Override@H_404_13@
public@H_