安卓 解析xml

来源:互联网 发布:最简单的游戏c编程 编辑:程序博客网 时间:2024/05/14 18:27

安卓获取服务器的数据分为两种形式,一种为xml,一种为json.这两种形式都需要通过解析才能获得数据,今天就分享一下xml的解析。博主写了一个小demo。从java服务器中获取数据并展示在移动端。由于一些问题,不能放效果图,不过主页面也就是一个Button,通过Button点击事件获取数据。接下来贴的是服务器的代码。实体类就不贴了,直接贴方法吧!因为是个简单的demo,数据就是模拟的。

java代码:

@RequestMapping("getdata.xhtml")    public String getxml(HttpServletRequest req){        //获取数据  调用数据库查询数据,返回数据集合        //list为有序  set为无序        List<Friendring> fr=new ArrayList<Friendring>();        //遍历数据:        for (int i = 0;i< 10; i++) {            //得到时间            Calendar calendar=Calendar.getInstance();                int  year=calendar.get(Calendar.YEAR);                int  month=calendar.get(Calendar.MONTH);                int  day=calendar.get(Calendar.DAY_OF_MONTH);              fr.add(new Friendring("cat"+i,"very cut",year+"-"+month+"-"+day));           }        // 将对象集合存放到请求域中        req.setAttribute("fr",fr);        return "showdata";    }

其jsp页面:

<?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"%><fqs><c:forEach items="${fr}" var="fr">            <fq name="${fr.name}">                <content>${fr.content}</content>                <time>${fr.time}</time>            </fq>    </c:forEach>    </fqs>

接下来就是移动端接受数据了,但他们之间要想实现连接呢!先需要搭个局域网。至于局域网怎么搭呢?就是你的服务端要与移动端连接同一个网,也就是同一个ip地址,可以好好百度一下,就不说这么多了。接下来贴的是xml:

<?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:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    android:orientation="vertical"    tools:context="com.example.an_parsexml.MainActivity">    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="获取XML"        android:onClick="getXML"        />    <ListView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/lv_main_list"        >    </ListView></LinearLayout>

其对应的activity:

package com.example.an_parsexml;import android.app.ProgressDialog;import android.os.AsyncTask;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;public class MainActivity extends AppCompatActivity {    private ProgressDialog progressDialog;    private ListView lv_main_list;    private List<Friendring> lists=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);        Log.i("test","ccccc");        //加载进度        progressDialog = new ProgressDialog(this);        progressDialog.setMessage("玩命加载中");    }   class Myadapter extends BaseAdapter{       @Override       public int getCount() {           return lists.size();        }       @Override       public Object getItem(int position) {           return lists.get(position);       }       @Override       public long getItemId(int position) {           return position;       }       @Override       public View getView(int position, View convertView, ViewGroup parent) {       if (convertView==null){           convertView= getLayoutInflater().from(MainActivity.this).inflate(R.layout.item_listview,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_time= (TextView) convertView.findViewById(R.id.tv_item_listview_time);         //  Log.i("test","bbbbbbbb");           convertView.setTag(itemtag);       }           Itemtag itemtag= (Itemtag) convertView.getTag();           itemtag.tv_name.setText(lists.get(position).getName());           itemtag.tv_content.setText(lists.get(position).getContent());           itemtag.tv_time.setText(lists.get(position).getTime());          // Log.i("test","aaaaaaaaa");           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) {           List<Friendring> fd=new ArrayList<>();            //获取网络数据            //1,获取网络数据的路径       String  path="http://192.168.253.10:8090/front/getdata.xhtml";          //2 实例化url            try {                URL url=new URL(path);             //3 获取连接对象(也就是正式建立连接)                HttpURLConnection  connection= (HttpURLConnection) url.openConnection();                //4,设置请求方式                connection.setRequestMethod("GET");                //5 设置请求超时的时间                connection.setConnectTimeout(5000);                //6  判断是否能拿到数据  获取响应码                int code=connection.getResponseCode();                if(code==200){               // 7 获取返回过来的数据(xml)                    //返回数据 通过流的方式拿                 InputStream is= connection.getInputStream();                 //测试 是否拿到数据                    //读取出来  用缓冲字符流  把字节转成字符                  //  String str=null;//                    BufferedReader br=new BufferedReader(new InputStreamReader(is));//                     while ((str=br.readLine())!=null){//                        Log.i("test",str);//                    }                    //解析  方式:dom sax pull                    //其一  DOM解析  一次性解析完                    try {                        //通过工厂                        DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();                        DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();                          //得到流                       Document document= documentBuilder.parse(is);                        //开始解析 获得跟标签                      Element root=document.getDocumentElement();                      //  Log.i("test","获得跟标签");                      //node  Element区别:node 包含所有 比如空格 Element只包含标签                        //获得节点名 子标签                       NodeList nodeList= root.getElementsByTagName("fq");                        //遍历                        for (int i = 0; i <nodeList.getLength() ; i++) {                            //获取下面的子标签                              Element elment= (Element) nodeList.item(i);                              //获取属性name                            String name=elment.getAttribute("name");                            Log.i("test",name);                            //获取子标签                            Element elmentcontent= (Element) elment.getElementsByTagName("content").item(0);                            //得到文本内容:                          String content= elmentcontent.getTextContent();                            Element  elementtime= (Element) elment.getElementsByTagName("time").item(0);                            //得到文本内容:                            String time= elementtime.getTextContent();                            Log.i("test",name+content+""+time);                            //将其加到集合                            Friendring friendring=new Friendring(name,content,time);                            fd.add(friendring);                        }                    } catch (ParserConfigurationException e) {                        e.printStackTrace();                    } catch (SAXException e) {                        e.printStackTrace();                    }                }            } catch (java.io.IOException e) {                e.printStackTrace();            }            return  fd;        }   //更新页面        @Override        protected void onPostExecute(Object o) {            super.onPostExecute(o);            List<Friendring> fd= (List<Friendring>) o;            //把数据加入到适配器当中            lists.addAll(fd);            //通知适配器发生改变            myadapter.notifyDataSetChanged();            progressDialog.cancel();           // Log.i("test","dddddd");        }    }}

展示数据xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="horizontal" android:layout_width="match_parent"    android:layout_height="match_parent">    <TextView        android:text="TextView"        android:layout_width="0dp"        android:layout_weight="1"        android:layout_height="wrap_content"        android:id="@+id/tv_item_listview_name" />    <TextView        android:text="TextView"        android:layout_width="0dp"        android:layout_weight="1"        android:layout_height="wrap_content"        android:id="@+id/tv_item_listview_content" />    <TextView        android:text="TextView"        android:layout_width="0dp"        android:layout_weight="1"        android:layout_height="wrap_content"        android:id="@+id/tv_item_listview_time" /></LinearLayout>

实体类那些就不贴了,别忘了配置联网权限

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
0 0
原创粉丝点击