STAX解析

来源:互联网 发布:单桂敏淘宝哪个真的 编辑:程序博客网 时间:2024/06/05 21:14

STAX 拉模式xml 解析方式 —– 客户端程序,自己控制xml事件,主动调用相应事件方法

当使用XML PULL 如果使用Android系统,系统内置无需下载任何开发包,如果想JavaSE JavaEE 使用pull 解析技术 下载单独pull 开发工具包

xpp3 —– XML Pull Parser 3 是pull API 代码实现

使用pull 解析器
1、去网站上 下载 pull 解析器实现 xpp3 (Android 内置)
2、将 xpp3-1.1.3.4.C.jar 导入 java工程
导入jar包 位于 当前工程内部 , 在工程内新建 lib ,将jar复制过来 , 将pull 解析器 jar 添加build path

jar 包就是.class文件 集合压缩包 (采用zip格式压缩)

Pull解析器 使用 stax 解析方式 —- 拉模式解析
Pull采用将xml文档传递 解析器,手动通过next触发文档解析事件,在客户端代码中获取当前事件 ,从而调用相应事件处理方法

3、创建pull 解析器
4、将xml 文档内容传递 pull 解析器

为什么 STAX 解析方式 效率 好于 SAX ?
1、SAX 无选择性的,所有事件都会处理 解析方式,Stax 由用户控制需要处理事件类型
2、在使用Stax进行数据解析时,随时终止解析

Pull 解析器 生成 xml 文档功能 —- 通过 XmlSerializer 生成 xml 文档
解析xml : 文档开始、元素开始、文本元素、元素结束、文档结束
生成xml :生成文档声明(文档开始),元素开始、文本内容、元素结束 、文档结束
1、生成简单xml
2、通过对象数据生成xml
3、通过对象List数据生成xml

在程序中抽取两个方法 —– 1. xml — List对象 2. List对象生成xml

对内存中List进行CURD操作

XML 文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><companies>    <company>        <name>西藏大学</name>        <pnum>40000</pnum>        <address>拉萨</address>    </company>    <company>        <name>新疆大学</name>        <pnum>30000</pnum>        <address>新疆</address>    </company></companies>

编写一个 company实体

package com.qddx.ws;public class company {    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getPnum() {        return pnum;    }    public void setPnum(int pnum) {        this.pnum = pnum;    }    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }    private int pnum;    private String address;}

解析的工具类

package com.qddx.ws;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserFactory;import org.xmlpull.v1.XmlSerializer;/* * 抽取两个方法 XMl--list对象  list对象---XML *  * */public class PullUtils {    /*     * 接收xml文件返回list集合     */    public static List<company> ParseXMLtoList(String fileName)            throws Exception {        // 获得解析器        List<company> companies = new ArrayList<company>();        XmlPullParser xmls = XmlPullParserFactory.newInstance().newPullParser();        // 设置xml输入文件        xmls.setInput(new FileInputStream(fileName), "UTF-8");        int event;        // 定义一个临时的company引用        company com = null;        while ((event = xmls.getEventType()) != XmlPullParser.END_DOCUMENT) {            // 将每个company对象封装成company对象            // 1.在company开始的时候 创建company对象            if (event == XmlPullParser.START_TAG                    && xmls.getName().equals("company")) {                com = new company();            }            // 2.读取name元素是时,向company对象封装name属性            if (event == XmlPullParser.START_TAG                    && xmls.getName().equals("name")) {                com.setName(xmls.nextText());            }            // 3.读取pnum属性时 向company对象封装pnum属性            if (event == XmlPullParser.START_TAG                    && xmls.getName().equals("pnum")) {                com.setPnum(Integer.parseInt(xmls.nextText()));            }            // 4.读取address属性时向company对象封装address属性            if (event == XmlPullParser.START_TAG                    && xmls.getName().equals("address")) {                com.setAddress(xmls.nextText());            }            // 读取company 结束时将company对象加入集合            if (event == XmlPullParser.END_TAG                    && xmls.getName().equals("company")) {                companies.add(com);            }            // 解析下一个事件            xmls.next();        }        return companies;    }    public static void ParseListtoXML(List<company> companies, String fileName)            throws Exception {        // 获得序列化对象        XmlSerializer xmls = XmlPullParserFactory.newInstance().newSerializer();        // 写文件之前 指定要输出的文件        xmls.setOutput(new FileOutputStream(fileName), "UTF-8");        // 文档开始        xmls.startDocument("UTF-8", true);        // 根元素开始        xmls.startTag(null, "companies");        for (company c : companies) {            // company属性开始            xmls.startTag(null, "company");            // name属性开始            xmls.startTag(null, "name");            // 文本属性            xmls.text(c.getName());            // name属性结束            xmls.endTag(null, "name");            // pnum属性开始            xmls.startTag(null, "pnum");            // 文本属性开始            xmls.text(c.getPnum() + "");            // pnum属性结束            xmls.endTag(null, "pnum");            // address属性开始            xmls.startTag(null, "address");            // 文本属性            xmls.text(c.getAddress());            // address属性结束            xmls.endTag(null, "address");            // company属性结束            xmls.endTag(null, "company");        }        // 根元素结束        xmls.endTag(null, "companies");        // 文档结束        xmls.endDocument();    }}

测试 和增删改查

package com.qddx.ws;import java.io.FileInputStream;import java.util.ArrayList;import java.util.List;import org.junit.Test;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserFactory;/* * 完成pULL解析CURD *  * */public class PullCURD {    @Test    public void TestDelete() throws Exception {        // 1. 将xml数据加载到内存        List<company> companies = PullUtils.ParseXMLtoList("companies.xml");        // 从 List集合删除西藏大学的company对象        for (company com : companies) {            if (com.getName().equals("西藏大学")) {                companies.remove(com);                break;            }        }        // 3.回写到xml        PullUtils.ParseListtoXML(companies, "company_bak_xml");    }    @Test    public void TestUpdate() throws Exception {        // 将 xml数据加载到内存        List<company> companies = PullUtils.ParseXMLtoList("companies.xml");        // 遍历company集合        for (company com : companies) {            if (com.getName().equals("新疆大学")) {                com.setPnum(com.getPnum() * 2);            }        }        // 回写到xml        PullUtils.ParseListtoXML(companies, "company_bak.xml");    }    @Test    public void TestSelect() throws Exception {        // 解析xml数据到内存        List<company> companies = PullUtils.ParseXMLtoList("company.xml");        // 遍历company 集合        for (company com : companies) {            if (com.getName().equals("新疆大学")) {                System.out.println(com.getPnum());            }        }    }    @Test    public void TestAdd() throws Exception {        // 解析xml数据到内存        List<company> companies = PullUtils.ParseXMLtoList("company.xml");        company com = new company();        com.setName("江南");        com.setPnum(3000);        com.setAddress("南方的");        companies.add(com);        PullUtils.ParseListtoXML(companies, "company_bak.xml");    }    @Test    // 测试工具类PullUtils 中的方法    public void demo2() throws Exception {        // 将company。xml 复制 company_bak.xml        // 解析获得集合        List<company> companies = PullUtils.ParseXMLtoList("company.xml");        // 将集合写入 company_bak.xml        PullUtils.ParseListtoXML(companies, "company_bak.xml");    }    @Test    // 将xml中的数据---List集合    public void demo1() throws Exception {        // 获得解析器        XmlPullParser xmls = XmlPullParserFactory.newInstance().newPullParser();        List<company> companies = new ArrayList<company>();        company com = null;        // 向解析器传入xml文件        xmls.setInput(new FileInputStream("companies.xml"), "UTF-8");        // 遍历解析        int event;        while ((event = xmls.getEventType()) != XmlPullParser.END_DOCUMENT) {            if (event == XmlPullParser.START_TAG                    && xmls.getName().equals("company")) {                // 创建com对象                com = new company();            }            if (event == XmlPullParser.START_TAG                    && xmls.getName().equals("name")) {                // 元素开始封装属性                com.setName(xmls.nextText());            }            if (event == XmlPullParser.START_TAG                    && xmls.getName().equals("pnum")) {                com.setPnum(Integer.parseInt(xmls.nextText()));            }            if (event == XmlPullParser.START_TAG                    && xmls.getName().equals("address")) {                com.setAddress(xmls.nextText());            }            if (event == XmlPullParser.END_TAG                    && xmls.getName().equals("company")) {                // 结束                companies.add(com);            }            xmls.next();        }        for (company c : companies) {            System.out.println(c.getName());            System.out.println(c.getAddress());            System.out.println(c.getPnum());            System.out.println("------------");        }    }}

本笔记来源于 视频课程 仅供记录学习。

0 0