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


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

                                高尔基《海燕》

我用的是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地址就可以了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值