Android网络数据xml解析

     Android网络编程里,如果要将web端的数据(也就是Java端)给Android端,Android去接收数据,最常见就有解析xml了,那么今天我们就来讲讲怎样解析xml

    我们先在web端里模拟一组数据,并将它发送到请求域当中去,代码如下:(我用的是ssh框架)

    

public class FQAcgtion extends ActionSupport {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * XAX
	 * @return   返回值
	 * @throws Exception
	 * 
	 */
	public String getXML() throws Exception {
		// 获取数据
		// 调用数据库查询数据,返回对象集合(....)
		List<FQ> fqs = new ArrayList<FQ>();
		for (int i = 1; i <= 100; 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);
			fqs.add(new FQ("小" + i, "今天心情很nice", year + "-" + month + "-" + day));
		}

		// 将对象集合存放到请求域中
		//ServletActionContext.getRequest().setAttribute("fqs", fqs);

		return "dataResult";
	}
	
	
	
}
        然后我们再来一个XML(dataresult)返回我们模拟的数据

        细节注意:上面最好都不要留有空格,不然我们在Android端解析的时候会解析不到数据

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

        web端我们准备好了,现在我们开始在Android端解析数据,我们将数据解析到Android端,并用listview控件展示到我们的手机或者夜神上面:


       截图如下:





       XML解析数据有三种方式:

       main.xml

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

     list_view.xml:



     fq.class(里面放的是你的XML标签名,web端和Android端都需要有)

public class FQ {
	private String name;
	private String content;
	private String time;
	public FQ() {
		super();
	}
	public FQ(String name, String content, String time) {
		super();
		this.name = name;
		this.content = content;
		this.time = time;
	}
	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;
	}
}


       itemtag.class(listview优化)

public class ItemTag {
    public TextView tv_name;
    public TextView tv_content;
    public TextView tv_time;
}



       1、DOM模式解析(并不推荐)(getString(R.String.server_name))这里放的是你的Java项目路径以及局域网络域名(如:198.68.34等等),我写在了res/values/Strings.xml里面,这样就可以减少重复代码,而且也不会被别人看到你的项目名以及域名

   

public class MainActivity extends AppCompatActivity {

private ProgressDialog progressDialog; private ListView lv_main_list; private List<FQ> 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); progressDialog = new ProgressDialog(this); progressDialog.setMessage("正在拼命loading中..."); } class MyAdapter extends BaseAdapter{ @Override public int getCount() { return lists.size(); } @Override public Object getItem(int i) { return lists.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { if(view==null){ view=LayoutInflater.from(MainActivity.this).inflate(R.layout.item_listview,null); ItemTag itemTag=new ItemTag(); itemTag.tv_content= (TextView) view.findViewById(R.id.tv_item_listview_content); itemTag.tv_name= (TextView) view.findViewById(R.id.tv_item_listview_name); itemTag.tv_time= (TextView) view.findViewById(R.id.tv_item_listview_time); view.setTag(itemTag); } ItemTag itemTag= (ItemTag) view.getTag(); itemTag.tv_name.setText(lists.get(i).getName()); itemTag.tv_content.setText(lists.get(i).getContent()); itemTag.tv_time.setText(lists.get(i).getTime()); return view; } } 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[] objects) { List<FQ> fqs=new ArrayList<>(); //获取网络数据 //01.定义获取网络的数据的路径 String path=getString(R.String.server_name)+"fqActiongetXML.action"; try { //02.实例化Url URL url=new URL(path); //03.获取连接对象 HttpURLConnection conn= (HttpURLConnection) url.openConnection(); //04.设置请求方式 conn.setRequestMethod("GET"); //05.设置请求连接超时的时间 conn.setConnectTimeout(5000); //06.获取响应码 int code=conn.getResponseCode(); if(code==200){ //07.获取返回过来的数据(XML) InputStream is =conn.getInputStream(); //08.测试(删除-注释) //缓冲字符流 String str=null; // BufferedReader br=new BufferedReader(new InputStreamReader(is)); // while((str=br.readLine())!=null){ // Log.i("test",str); // } //09.解析XML //方式:DOM SAX PULL //09.1 使用DOM解析 //设计模式: //单例模式(饿汉 懒汉) try { DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder(); Document document=documentBuilder.parse(is); //获取跟标签 Element root=document.getDocumentElement(); Log.i("test","跟标签:"+root.getTagName()); //Node Element 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(); Log.i("test",name+" "+content+" "+time); FQ fq=new FQ(name,content,time); fqs.add(fq); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return fqs; } //更新UI @Override protected void onPostExecute(Object o) { super.onPostExecute(o); List<FQ> fqs= (List<FQ>) o; lists.addAll(fqs); myAdapter.notifyDataSetChanged(); progressDialog.cancel(); } } }


       2、SAX解析模式


public class MainActivity extends AppCompatActivity {

    private ProgressDialog progressDialog;
    private ListView lv_main_list;
    String currentTag=null;

    private List<FQ> 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);


        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("正在拼命loading中...");
    }

    class MyAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            return lists.size();
        }

        @Override
        public Object getItem(int i) {
            return lists.get(i);
        }

        @Override
        public long getItemId(int i) {
            return i;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            if(view==null){
                view=LayoutInflater.from(MainActivity.this).inflate(R.layout.item_listview,null);

                ItemTag itemTag=new ItemTag();

                itemTag.tv_content= (TextView) view.findViewById(R.id.tv_item_listview_content);
                itemTag.tv_name= (TextView) view.findViewById(R.id.tv_item_listview_name);
                itemTag.tv_time= (TextView) view.findViewById(R.id.tv_item_listview_time);

                view.setTag(itemTag);
            }

            ItemTag itemTag= (ItemTag) view.getTag();
            itemTag.tv_name.setText(lists.get(i).getName());
            itemTag.tv_content.setText(lists.get(i).getContent());
            itemTag.tv_time.setText(lists.get(i).getTime());

            return view;
        }
    }





    public void getXML(View view){
        new MyTask().execute();


    }

    class MyTask extends AsyncTask{

        private FQ fq;
        private FQ fq1;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog.show();
        }

        @Override
        protected Object doInBackground(Object[] objects) {

            final List<FQ> fqs=new ArrayList<>();

            //获取网络数据
            //01.定义获取网络的数据的路径
            String path=getString(R.string.server_name)+"fqActiongetXML.action";
            try {
                //02.实例化Url
                URL url=new URL(path);
                //03.获取连接对象
                HttpURLConnection conn= (HttpURLConnection) url.openConnection();
                //04.设置请求方式
                conn.setRequestMethod("GET");
                //05.设置请求连接超时的时间
                conn.setConnectTimeout(5000);

                //06.获取响应码
                int code=conn.getResponseCode();
                if(code==200){
                    //07.获取返回过来的数据(XML)
                    InputStream is =conn.getInputStream();
                    //08.测试(删除-注释)
                    //缓冲字符流
                    String str=null;
//                    BufferedReader br=new BufferedReader(new InputStreamReader(is));
//                    while((str=br.readLine())!=null){
//                        Log.i("test",str);
//                    }
                    //09.解析XML

                    //02.使用SAX解析:特点:边读边解析  基于事件(方法)驱动方式
                    //开始文档 开始标签  结束标签 结束文档  文本
                    //<name>张三</name>
//                    try {
//                        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 (ParserConfigurationException e) {
//                        e.printStackTrace();
//                    } catch (SAXException e) {
//                        e.printStackTrace();
//                    }

                  

        //更新UI
        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);

            List<FQ> fqs= (List<FQ>) o;

            lists.addAll(fqs);

            myAdapter.notifyDataSetChanged();

            progressDialog.cancel();
        }
    }

}


       3、PULL解析模式(Android特有的)

    

public class MainActivity extends AppCompatActivity {

    private ProgressDialog progressDialog;
    private ListView lv_main_list;
    String currentTag=null;

    private List<FQ> 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);


        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("正在拼命loading中...");
    }

    class MyAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            return lists.size();
        }

        @Override
        public Object getItem(int i) {
            return lists.get(i);
        }

        @Override
        public long getItemId(int i) {
            return i;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            if(view==null){
                view=LayoutInflater.from(MainActivity.this).inflate(R.layout.item_listview,null);

                ItemTag itemTag=new ItemTag();

                itemTag.tv_content= (TextView) view.findViewById(R.id.tv_item_listview_content);
                itemTag.tv_name= (TextView) view.findViewById(R.id.tv_item_listview_name);
                itemTag.tv_time= (TextView) view.findViewById(R.id.tv_item_listview_time);

                view.setTag(itemTag);
            }

            ItemTag itemTag= (ItemTag) view.getTag();
            itemTag.tv_name.setText(lists.get(i).getName());
            itemTag.tv_content.setText(lists.get(i).getContent());
            itemTag.tv_time.setText(lists.get(i).getTime());

            return view;
        }
    }





    public void getXML(View view){
        new MyTask().execute();


    }

    class MyTask extends AsyncTask{

        private FQ fq;
        private FQ fq1;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog.show();
        }

        @Override
        protected Object doInBackground(Object[] objects) {

            final List<FQ> fqs=new ArrayList<>();

            //获取网络数据
            //01.定义获取网络的数据的路径
            String path=getString(R.string.server_name)+"fqActiongetXML.action";
            try {
                //02.实例化Url
                URL url=new URL(path);
                //03.获取连接对象
                HttpURLConnection conn= (HttpURLConnection) url.openConnection();
                //04.设置请求方式
                conn.setRequestMethod("GET");
                //05.设置请求连接超时的时间
                conn.setConnectTimeout(5000);

                //06.获取响应码
                int code=conn.getResponseCode();
                if(code==200){
                    //07.获取返回过来的数据(XML)
                    InputStream is =conn.getInputStream();
                    //08.测试(删除-注释)
                    //缓冲字符流
                    String str=null;
//                    BufferedReader br=new BufferedReader(new InputStreamReader(is));
//                    while((str=br.readLine())!=null){
//                        Log.i("test",str);
//                    }
                    //09.解析XML
                    try {
                        //03.使用PULL解析
                        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 startTagName=pullParser.getName();
                                    if("fq".equals(startTagName)){
                                        fq1 = new FQ();
                                        String name=pullParser.getAttributeValue(0);
                                        fq1.setName(name);
                                    }else if("content".equals(startTagName)){
                                       String content= pullParser.nextText();
                                        fq1.setContent(content);
                                    }else if("time".equals(startTagName)){
                                        String time= pullParser.nextText();
                                        fq1.setTime(time);
                                    }
                                    break;
                                case XmlPullParser.END_TAG:
                                    //获取结束标签的名字
                                    String endTagName=pullParser.getName();
                                    if("fq".equals(endTagName)){
                                        fqs.add(fq1);
                                    }
                                    break;
                            }
                            type=pullParser.next();
                        }
                    } catch (XmlPullParserException e) {
                        e.printStackTrace();
                    }


                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return fqs;
        }

        //更新UI
        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);

            List<FQ> fqs= (List<FQ>) o;

            lists.addAll(fqs);

            myAdapter.notifyDataSetChanged();

            progressDialog.cancel();
        }
    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值