详解Android之解析XML文件三种方式(DOM,PULL,SAX)

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" />

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-09-20 00:41:12

详解Android之解析XML文件三种方式(DOM,PULL,SAX)的相关文章

详解Android中解析XML的方法_Android

XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建的方法. 在Android中,常见的XML解析器分别为SAX解析器.DOM解析器和PULL解析器,下面,我将一一向大家详细介绍. SAX解析器: SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事

Android解析XML的三种方式SAX、Pull、Dom_Android

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),本文对android解析xml的这三种方式进行一次总结. 今天解析的xml示例(channels.xml)如下: <?xml version="1.0" encoding="utf-8"?> <channel> <item id=&quo

Android解析XML的三种方式SAX、Pull、Dom

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),本文对android解析xml的这三种方式进行一次总结. 今天解析的xml示例(channels.xml)如下: <?xml version="1.0" encoding="utf-8"?> <channel> <item id=&quo

详解Android中解析XML的方法

XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建的方法. 在Android中,常见的XML解析器分别为SAX解析器.DOM解析器和PULL解析器,下面,我将一一向大家详细介绍. SAX解析器: SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事

Android编程解析XML文件的方法详解【基于XmlPullParser】

本文实例讲述了Android编程解析XML文件的方法.分享给大家供大家参考,具体如下: 前言 在学习Android的Framework层源码时,Android大量的使用XmlPullParser来解析xml文件的源码.因此,这里也顺道介绍一下XmlPullParser的使用. XML XML(eXtensible Markup Language)中文名为可扩展标记语言.标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等. 用途 XML设计用了传送及携带数据信息,

深入解读Python解析XML的几种方式

在XML解析方面,Python贯彻了自己"开箱即用"(batteries included)的原则.在自带的标准库中,Python提供了大量可以用于处理XML语言的包和工具,数量之多,甚至让Python编程新手无从选择. 本文将介绍深入解读利用Python语言解析XML文件的几种方式,并以笔者推荐使用的ElementTree模块为例,演示具体使用方法和场景.文中所使用的Python版本为2.7. 什么是XML? XML是可扩展标记语言(Extensible Markup Languag

具体实现XML的三种方式

xml 在熟悉XML之前,我们至少应该了解一下这个技术到底是如何具体实现的.就目前的趋势来看(因为XML的有关标准改动都多达十七八次的,所以先不管它最后会怎样,先就目前的实现方式来看),要使得用户最后能够在客户端看到使用XML技术做出来的东西(如果要是用行业术语来解释的话,就是说,如何使用XSL级联样表转换XML的文档成其他的格式例如HTML.),主要有下面的三种实现手段: 1.第一种方式为:     让XML文档和与其关联的XSL级联样表同时被传送到客户端(通常使用的是浏览器),然后在客户端让

具体实现 XML 的三种方式

xml 在熟悉XML之前,我们至少应该了解一下这个技术到底是如何具体实现的.就目前的趋势来看(因为XML的有关标准改动都多达十七八次的,所以先不管它最后会怎样,先就目前的实现方式来看),要使得用户最后能够在客户端看到使用XML 技术做出来的东西(如果要是用行业术语来解释的话,就是说,如何使用XSL级联样表转换XML的文档成其他的格式例如HTML.),主要有下面的三种实现手段: 1.第一种方式为: 让XML文档和与其关联的XSL级联样表同时被传送到客户端(通常使用的是浏览器),然后在客户端让XML

Android获取view高度的三种方式_Android

本文为大家分享了Android获取view高度的方法,供大家参考,具体内容如下 getMeasuredHeight()与getHeight的区别 实际上在当屏幕可以包裹内容的时候,他们的值相等, 只有当view超出屏幕后,才能看出他们的区别: getMeasuredHeight()是实际View的大小,与屏幕无关, 而getHeight的大小此时则是屏幕的大小. 当超出屏幕后,getMeasuredHeight()等于getHeight()加上屏幕之外没有显示的大小 具体方法 我们知道在oncr