安卓 解析xml

安卓获取服务器的数据分为两种形式,一种为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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值