详解Android之解析XML文件三种方式(DOM,PULL,SAX)
程序员文章站
2023-12-17 15:14:58
1.xml文件代码
<%@ page la...
1.xml文件代码
<?xml version="1.0" encoding="utf-8" ?> <%@ page language="java" contenttype="text/xml; charset=utf-8" pageencoding="utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ page iselignored="false" %> <fqs> <c:foreach items="${fqs}" var="fq"> <fq name="${fq.name}"> <content>${fq.content}</content> <time>${fq.time}</time> </fq> </c:foreach> </fqs>
2.xml网页效果图
3.android代码
1.布局文件
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <button android:layout_width="match_parent" android:layout_height="wrap_content" android:onclick="getxml" android:text="获取xml数据" /> <listview android:id="@+id/lv_main_list" android:layout_width="match_parent" android:layout_height="wrap_content"> </listview> </linearlayout> <?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main_pull" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <button android:layout_width="match_parent" android:layout_height="wrap_content" android:onclick="getpull" android:text="获取pull数据" /> <listview android:id="@+id/lv_mainpull_list" android:layout_width="match_parent" android:layout_height="wrap_content"> </listview> </linearlayout> <?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main_sax" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <button android:layout_width="match_parent" android:layout_height="wrap_content" android:onclick="getsax" android:text="获取sax数据" /> <listview android:id="@+id/lv_mainsax_list" android:layout_width="match_parent" android:layout_height="wrap_content"> </listview> </linearlayout> <?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <textview android:layout_width="0dp" android:layout_height="wrap_content" android:id="@+id/tv_item_listview_name" android:layout_weight="1"/> <textview android:layout_width="0dp" android:layout_height="wrap_content" android:id="@+id/tv_item_listview_content" android:layout_weight="1"/> <textview android:layout_width="0dp" android:layout_height="wrap_content" android:id="@+id/tv_item_listview_time" android:layout_weight="1"/> </linearlayout>
2.java代码
dom解析代码
public class mainactivity extends appcompatactivity { private listview lv_main_list; private progressdialog progressdialog; private list<fq> fqs = new arraylist<>(); private myadapter myadapter; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); lv_main_list = (listview) findviewbyid(r.id.lv_main_list); myadapter = new myadapter(); lv_main_list.setadapter(myadapter); progressdialog = new progressdialog(this); progressdialog.setmessage("小青正在拼命加載中....."); } class myadapter extends baseadapter{ @override public int getcount() { return fqs.size(); } @override public object getitem(int position) { return fqs.get(position); } @override public long getitemid(int position) { return position; } @override public view getview(int position, view convertview, viewgroup parent) { if(convertview==null){ convertview=layoutinflater.from(mainactivity.this).inflate(r.layout.item_list,null); itemtag itemtag=new itemtag(); itemtag.tv_name= (textview) convertview.findviewbyid(r.id.tv_item_listview_name); itemtag.tv_content= (textview) convertview.findviewbyid(r.id.tv_item_listview_content); itemtag.tv_tiem= (textview) convertview.findviewbyid(r.id.tv_item_listview_time); convertview.settag(itemtag); } itemtag itemtag= (itemtag) convertview.gettag(); itemtag.tv_name.settext(fqs.get(position).getname()); itemtag.tv_content.settext(fqs.get(position).getcontent()); itemtag.tv_tiem.settext(fqs.get(position).gettime()); return convertview; } } public void getxml(view view) { new mytask().execute(); } class mytask extends asynctask { //获取数据前 @override protected void onpreexecute() { super.onpreexecute(); progressdialog.show(); } @override protected object doinbackground(object[] params) { //获取网络数据 //1.定义获取网络的数据的路径 string path = "http://192.168.43.149:8080/dataresult.xhtml"; //2.实例化url try { url url = new url(path); //3.获取链接对象 httpurlconnection httpurlconnection = (httpurlconnection) url.openconnection(); //4.设置请求 httpurlconnection.setrequestmethod("get"); //5.设置请求链接超时的时间 httpurlconnection.setconnecttimeout(5000); //6.获取响应码 int code = httpurlconnection.getresponsecode(); if (code == 200) { //7.获取返回过来的数据(xml) inputstream is = httpurlconnection.getinputstream(); //8.使用dom解析xml文件 documentbuilderfactory documentbuilderfactory=documentbuilderfactory.newinstance(); documentbuilder documentbuilder=documentbuilderfactory.newdocumentbuilder(); document document=documentbuilder.parse(is); //获取根标签 element root=document.getdocumentelement(); nodelist nodelist = root.getelementsbytagname("fq"); for (int i = 0; i < nodelist.getlength(); i++) { element element = (element) nodelist.item(i); //获取属性name string name = element.getattribute("name"); //获取子标签content,time element elementcontent = (element) element.getelementsbytagname("content").item(0); string content = elementcontent.gettextcontent(); element elementtime = (element) element.getelementsbytagname("time").item(0); string time = elementtime.gettextcontent(); fq fq = new fq(name, content, time); fqs.add(fq); } } } catch (exception e) { e.printstacktrace(); } return fqs; } //获取数据后更新ui @override protected void onpostexecute(object o) { super.onpostexecute(o); progressdialog.cancel(); myadapter.notifydatasetchanged(); } } }
pull解析代码
public class mainpullactivity extends appcompatactivity { private listview lv_mainpull_list; private progressdialog progressdialog; private list<fq> fqs = new arraylist<>(); private myadapter myadapter; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main_pull); myadapter = new myadapter(); lv_mainpull_list = (listview) findviewbyid(r.id.lv_mainpull_list); lv_mainpull_list.setadapter(myadapter); progressdialog = new progressdialog(this); progressdialog.setmessage("小青正在拼命加載中....."); } class myadapter extends baseadapter { @override public int getcount() { return fqs.size(); } @override public object getitem(int position) { return fqs.get(position); } @override public long getitemid(int position) { return position; } @override public view getview(int position, view convertview, viewgroup parent) { if (convertview == null) { convertview = layoutinflater.from(mainpullactivity.this).inflate(r.layout.item_list, null); itemtag itemtag = new itemtag(); itemtag.tv_name = (textview) convertview.findviewbyid(r.id.tv_item_listview_name); itemtag.tv_content = (textview) convertview.findviewbyid(r.id.tv_item_listview_content); itemtag.tv_tiem = (textview) convertview.findviewbyid(r.id.tv_item_listview_time); convertview.settag(itemtag); } itemtag itemtag = (itemtag) convertview.gettag(); itemtag.tv_name.settext(fqs.get(position).getname()); itemtag.tv_content.settext(fqs.get(position).getcontent()); itemtag.tv_tiem.settext(fqs.get(position).gettime()); return convertview; } } public void getpull(view view) { new mytask().execute(); } class mytask extends asynctask { private fq fq; //获取数据前 @override protected void onpreexecute() { super.onpreexecute(); progressdialog.show(); } @override protected object doinbackground(object[] params) { //获取网络数据 //1.定义获取网络的数据的路径 string path = "http://192.168.43.149:8080/dataresult.xhtml"; //2.实例化url try { url url = new url(path); //3.获取链接对象 httpurlconnection httpurlconnection = (httpurlconnection) url.openconnection(); //4.设置请求 httpurlconnection.setrequestmethod("get"); //5.设置请求链接超时的时间 httpurlconnection.setconnecttimeout(5000); //6.获取响应码 int code = httpurlconnection.getresponsecode(); if (code == 200) { //7.获取返回过来的数据(xml) inputstream is = httpurlconnection.getinputstream(); //8.解析xml //使用pull解析xml文件 xmlpullparser pullparser= xml.newpullparser(); pullparser.setinput(is,"utf-8"); int type=pullparser.geteventtype(); while (type!=xmlpullparser.end_document){ switch (type){ case xmlpullparser.start_tag: //获取开始标签名字 string starttafname=pullparser.getname(); if("fq".equals(starttafname)){ fq = new fq(); string name=pullparser.getattributevalue(0); fq.setname(name); }else if ("content".equals(starttafname)){ string content=pullparser.nexttext(); fq.setcontent(content); }else if ("time".equals(starttafname)){ string time=pullparser.nexttext(); fq.settime(time); } break; case xmlpullparser.end_tag: //获取接受标签的名字 string endtagname=pullparser.getname(); if("fq".equals(endtagname)){ fqs.add(fq); } break; } type=pullparser.next(); } } } catch (exception e) { e.printstacktrace(); } return fqs; } //获取数据后更新ui @override protected void onpostexecute(object o) { super.onpostexecute(o); progressdialog.cancel(); myadapter.notifydatasetchanged(); } } }
sax解析代码
public class mainsaxactivity extends appcompatactivity { private listview lv_mainsax_list; private progressdialog progressdialog; private list<fq> fqs = new arraylist<>(); private myadapter myadapter; private string currenttag = null; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main_sax); lv_mainsax_list = (listview) findviewbyid(r.id.lv_mainsax_list); myadapter = new myadapter(); lv_mainsax_list.setadapter(myadapter); progressdialog = new progressdialog(this); progressdialog.setmessage("小青正在拼命加載中....."); } class myadapter extends baseadapter { @override public int getcount() { return fqs.size(); } @override public object getitem(int position) { return fqs.get(position); } @override public long getitemid(int position) { return position; } @override public view getview(int position, view convertview, viewgroup parent) { if (convertview == null) { convertview = layoutinflater.from(mainsaxactivity.this).inflate(r.layout.item_list, null); itemtag itemtag = new itemtag(); itemtag.tv_name = (textview) convertview.findviewbyid(r.id.tv_item_listview_name); itemtag.tv_content = (textview) convertview.findviewbyid(r.id.tv_item_listview_content); itemtag.tv_tiem = (textview) convertview.findviewbyid(r.id.tv_item_listview_time); convertview.settag(itemtag); } itemtag itemtag = (itemtag) convertview.gettag(); itemtag.tv_name.settext(fqs.get(position).getname()); itemtag.tv_content.settext(fqs.get(position).getcontent()); itemtag.tv_tiem.settext(fqs.get(position).gettime()); return convertview; } } public void getsax(view view) { new mytask().execute(); } class mytask extends asynctask { private fq fq; //获取数据前 @override protected void onpreexecute() { super.onpreexecute(); progressdialog.show(); } @override protected object doinbackground(object[] params) { //获取网络数据 //1.定义获取网络的数据的路径 string path = "http://192.168.43.149:8080/dataresult.xhtml"; //2.实例化url try { url url = new url(path); //3.获取链接对象 httpurlconnection httpurlconnection = (httpurlconnection) url.openconnection(); //4.设置请求 httpurlconnection.setrequestmethod("get"); //5.设置请求链接超时的时间 httpurlconnection.setconnecttimeout(5000); //6.获取响应码 int code = httpurlconnection.getresponsecode(); if (code == 200) { //7.获取返回过来的数据(xml) inputstream is = httpurlconnection.getinputstream(); //8.解析xml //使用sax解析xml文件 saxparserfactory saxparserfactory = saxparserfactory.newinstance(); saxparser saxparser = saxparserfactory.newsaxparser(); saxparser.parse(is, new defaulthandler() { @override public void startdocument() throws saxexception { super.startdocument(); } @override public void enddocument() throws saxexception { super.enddocument(); } @override public void startelement(string uri, string localname, string qname, attributes attributes) throws saxexception { super.startelement(uri, localname, qname, attributes); currenttag = localname; if ("fq".equals(localname)) { //实例化对象 fq = new fq(); string name = attributes.getvalue(0); fq.setname(name); } } @override public void endelement(string uri, string localname, string qname) throws saxexception { super.endelement(uri, localname, qname); currenttag=null; if ("fq".equals(localname)){ fqs.add(fq); } } @override public void characters(char[] ch, int start, int length) throws saxexception { super.characters(ch, start, length); if ("content".equals(currenttag)) { string content = new string(ch, start, length); fq.setcontent(content); }else if ("time".equals(currenttag)) { string time = new string(ch, start, length); fq.settime(time); } } }); } } catch (exception e) { e.printstacktrace(); } return fqs; } //获取数据后更新ui @override protected void onpostexecute(object o) { super.onpostexecute(o); progressdialog.cancel(); myadapter.notifydatasetchanged(); } } }
实体类
public class fq { private string name; private string content; private string time; public fq(){} public fq(string name, string time, string content) { this.name = name; this.time = time; this.content = content; } public string getname() { return name; } public void setname(string name) { this.name = name; } public string getcontent() { return content; } public void setcontent(string content) { this.content = content; } public string gettime() { return time; } public void settime(string time) { this.time = time; } } public class itemtag { public textview tv_name; public textview tv_content; public textview tv_tiem; }
配置文件添加联网权限
<!-- 添加联网的权限 --> <uses-permission android:name="android.permission.internet" />
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。