热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

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

这篇文章主要介绍了详解Android之解析XML文件三种方式,主要包括DOM,PULL,SAX,有兴趣的可以了解一下。

1.xml文件代码

<&#63;xml version="1.0" encoding="UTF-8" &#63;>
<%@ 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" %>


      
        ${fq.content}
        
      
  

2.XML网页效果图

3.Android代码

1.布局文件

<&#63;xml version="1.0" encoding="utf-8"&#63;>


  

2.java代码

DOM解析代码

public class MainActivity extends AppCompatActivity {

  private ListView lv_main_list;
  private ProgressDialog progressDialog;
  private List 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 

PULL解析代码

public class MainPullActivity extends AppCompatActivity {

  private ListView lv_mainpull_list;
  private ProgressDialog progressDialog;
  private List 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 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;
}

配置文件添加联网权限


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


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
author-avatar
p欧阳宏生
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有