Android解析XML(DOM解析,SAX解析,PULL解析)

来源:互联网 发布:如何下载matlab软件 编辑:程序博客网 时间:2024/06/11 13:24

一堆堆乌云,像青色的火焰,在无底的大海上燃烧。大海抓住闪电的箭光,把它们熄灭在自己的深渊里。这些闪电的影子,活像一条条火蛇,在大海里蜿蜒游动,一晃就消失了。
——暴风雨!暴风雨就要来啦!
这是勇敢的海燕,在怒吼的大海上,在闪电中间,高傲地飞翔;这是胜利的预言家在叫喊:
——让暴风雨来得更猛烈些吧!

                                高尔基《海燕》

我用的是SSM框架写的

Java代码:
UserController.java

@Controller@RequestMapping("/front/")public class UserController {    @Autowired    UserDao ud;    @RequestMapping("adduser.xhtml")    public String AddUser(Userentity userentity,HttpServletRequest request){        String uname=request.getParameter("uname");        String pwd=request.getParameter("pwd");        Userentity user=new Userentity();        user.setUname(uname);        user.setPwd(pwd);        int n=ud.addUser(user);        if(n>0){            System.out.println("增加成功");        }else{            System.out.println("增加失败");        }        return "index";    }    @RequestMapping("getuser.xhtml")    public String getuser(HttpServletRequest request){        List<Userentity> list=new ArrayList<Userentity>();        list=ud.getUsers();        request.setAttribute("list", list);        return "index";    }}

UserDao.java

public interface UserDao {    public int addUser(Userentity userentiy);    public List<Userentity > getUsers();

Userentity.java

public class Userentity {    private Integer uid;    private String uname;    private String pwd;    public Userentity(){    }    public Userentity(Integer uid, String uname, String pwd) {        super();        this.uid = uid;        this.uname = uname;        this.pwd = pwd;    }    public Integer getUid() {        return uid;    }    public void setUid(Integer uid) {        this.uid = uid;    }    public String getUname() {        return uname;    }    public void setUname(String uname) {        this.uname = uname;    }    public String getPwd() {        return pwd;    }    public void setPwd(String pwd) {        this.pwd = pwd;    }}

Userentity.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.zking.dao.UserDao">    <insert id="addUser" parameterType="com.zking.entity.Userentity">        INSERT into user values(null,#{uname},#{pwd});    </insert>    <select id="getUsers" resultType="com.zking.entity.Userentity">        select * from user    </select>    </mapper>

FastJsonHttpMessageConverter.java

public class FastJsonHttpMessageConverter extends        AbstractHttpMessageConverter<Object> {    public final static Charset UTF8 = Charset.forName("UTF-8");    private Charset charset = UTF8;    private SerializerFeature[] serializerFeature;    @Override    protected boolean supports(Class<?> clazz) {        return true;    }    @Override    protected Object readInternal(Class<? extends Object> clazz,            HttpInputMessage inputMessage) throws IOException,            HttpMessageNotReadableException {        ByteArrayOutputStream baos = new ByteArrayOutputStream();        InputStream in = inputMessage.getBody();        byte[] buf = new byte[1024];        for (;;) {            int len = in.read(buf);            if (len == -1) {                break;            }            if (len > 0) {                baos.write(buf, 0, len);            }        }        byte[] bytes = baos.toByteArray();        if (charset == UTF8) {            return JSON.parseObject(bytes, clazz);        } else {            return JSON.parseObject(bytes, 0, bytes.length,                    charset.newDecoder(), clazz);        }    }    @Override    protected void writeInternal(Object obj, HttpOutputMessage outputMessage)            throws IOException, HttpMessageNotWritableException {        OutputStream out = outputMessage.getBody();        byte[] bytes;        if (charset == UTF8) {            if (serializerFeature != null) {                bytes = JSON.toJSONBytes(obj, serializerFeature);            } else {                bytes = JSON.toJSONBytes(obj,                        SerializerFeature.WriteDateUseDateFormat);            }        } else {            String text;            if (serializerFeature != null) {                text = JSON.toJSONString(obj, serializerFeature);            } else {                text = JSON.toJSONString(obj,                        SerializerFeature.WriteDateUseDateFormat);            }            bytes = text.getBytes(charset);        }        out.write(bytes);    }}

index.jsp

<?xml version="1.0" encoding="UTF-8" ?><%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%><%@page isELIgnored="false" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><fqs><c:forEach items="${list}" var="fq">            <fq name="${fq.uid}">                 <name>${fq.name}</name>                <content>${fq.content}</content>                <time>${fq.time}</time>            </fq>    </c:forEach>    </fqs>

在这里的话能不空格就不要空格,要不然Android那边解析会出问题

Android:

activity_main.xml

<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: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.zking.risk_android_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>

item_listview.xml

<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:layout_weight="1"        android:text="Large Text"        android:id="@+id/tv_item_listview_name"        />    <TextView        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="Large Text"        android:id="@+id/tv_item_listview_content"        />    <TextView        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="Large Text"        android:id="@+id/tv_item_listview_time"        /></LinearLayout>

MainActity

public class MainActivity extends AppCompatActivity {    private ProgressDialog progressDialog;    private ListView lv_main_list;    private List<Userentity> 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() {            Log.i("ListView:",lists.size()+"  size:");            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_name = (TextView) view.findViewById(R.id.tv_item_listview_name);                itemTag.tv_content = (TextView) view.findViewById(R.id.tv_item_listview_content);                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[] params) {            List<Userentity> fqs=new ArrayList<>();            //获取网络数据            //1.定义获取网络的数据的路径            String path = getString(R.string.server_name)+"getuser.xhtml";            try {                //2.实例化Url                URL url = new URL(path);                //3.获取连接对象                HttpURLConnection connection = (HttpURLConnection) url.openConnection();                //4.设置请求方式                connection.setRequestMethod("GET");                //5.设置请求连接超时的时间[APP优化]                connection.setConnectTimeout(5000);                //6.获取响应码                int code = connection.getResponseCode();                if (code == 200) {                    //7.获取返回过来的数据(XML)                    InputStream is = connection.getInputStream();                    //8.测试(删除-注释)                    //缓冲字符流                    String str = null;//                    BufferedReader br = new BufferedReader(new InputStreamReader(is));////                    while ((str = br.readLine()) != null) {//                        Log.i("test", "str");//                    }                      //9.解析XML                    //方式:DOM SAX PULL                    //9.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());//                        NodeList nodeList = root.getElementsByTagName("fq");//                        Log.i("test", "根标签:" + nodeList.getLength());//                        for (int i = 0; i < nodeList.getLength(); i++) {//                            Element element = (Element) nodeList.item(i);//                            //获取属性name//                           String  name1 = element.getAttribute("name");//                           Log.i("test", name1+"");////                            //获取子标签<content><time>//                            Element elementName = (Element) element.getElementsByTagName("name").item(0);//                            String name = elementName.getTextContent();////                            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);////                            Userentity ut = new Userentity(Integer.parseInt(name1),name, content, time);//                            fqs.add(ut);//                        }//                    } catch (ParserConfigurationException e) {//                        e.printStackTrace();//                    } catch (SAXException e) {//                        e.printStackTrace();//                    }                    //2.使用SAX解析:特点:边读边解析 基于事件(方法)驱动方式                    //开始文档 开始标签 结束标签 结束文档 文本//                    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);//                                currenTag = localName;//                                if ("fq".equals(localName)) {//                                    //实例化对象//                                    userentity = new Userentity();//                                    String name = attributes.getValue(0);//                                    userentity.setName(name);//                                }////                            }////                            @Override//                            public void endElement(String uri, String localName, String qName) throws SAXException {//                                super.endElement(uri, localName, qName);////                                currenTag = null;//                                if ("fq".equals(localName)) {//                                    fqs.add(userentity);//                                }//////                            }////                            @Override//                            public void characters(char[] ch, int start, int length) throws SAXException {//                                super.characters(ch, start, length);////                                if ("content".equals(currenTag)) {//                                    String content = new String(ch, start, length);//                                    userentity.setContent(content);//                                } else if ("time".equals(currenTag)) {//                                    String time = new String(ch, start, length);//                                    userentity.setTime(time);//                                }//                            }//                        });//                    } catch (ParserConfigurationException e) {//                        e.printStackTrace();//                    } catch (SAXException e) {//                        e.printStackTrace();//                    }                    //3 使用PULL解析                    try {                        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)) {                                        userentity1 = new Userentity();                                        String name = pullParser.getAttributeValue(0);                                        userentity1.setName(name);                                    } else if ("content".equals(startTagName)) {                                        String content = pullParser.nextText();                                        userentity1.setContent(content);                                    } else if ("time".equals(startTagName)) {                                        String time = pullParser.nextText();                                        userentity1.setTime(time);                                    }                                    break;                                case XmlPullParser.END_TAG:                                    //获取结束标签的名字                                    String endTagName = pullParser.getName();                                    if ("fq".equals(endTagName)) {                                        fqs.add(userentity1);                                    }                                    break;                            }                            //type必须要重新赋值,要不然会导致死循环                            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<Userentity> fqs = (List<Userentity>) o;            lists.addAll(fqs);            myAdapter.notifyDataSetChanged();            progressDialog.cancel();        }    }}

ItemTag

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

Userentity

public class Userentity {    private int uid;    private String name;    private String content;    private String time;    public Userentity(int uid, String name, String content, String time) {        super();        this.uid = uid;        this.name = name;        this.content = content;        this.time = time;    }    public int getUid() {        return uid;    }    public void setUid(int uid) {        this.uid = uid;    }    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;    }}

strings.xml

<string name="server_name">http://193.168.4.59:8080/front/</string>

在values里面的strings.xml我把IP地址写在了这里面,就可以让他在以后的XML解析方便调用就好了

最后要说的是我这里调用的都是数据库里的数据,而不是死的数据,当然要是死的数据那就方便很多了,每次联网的IP地址都会改变,所有每次连上网都要在strings.xml里面改下IP地址就可以了

0 0
原创粉丝点击