xmlPullParser

来源:互联网 发布:cucumber java 编辑:程序博客网 时间:2024/06/05 14:23
public class PullParserDemo {
    private static ArrayList<Student> list;
    private static Student student;

    public static void main(String[] args) throws Exception {

首先都要先获取解析器对象

        // SAX:逐行解析 读取一行,释放一行 不占内存
        // 导入第三方jar包
        // 获取解析器工厂对象
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        // 从工厂里面 获取解析器对象
        XmlPullParser parser = factory.newPullParser();
        // 关联xml文件
        // 参数1 要解析的xml文件 参2:编码格式
        parser.setInput(new FileInputStream("students.xml"), "utf-8");
        // 获取事件类型
        // 指针默认的位置在文档开始
        // 从硬盘中把文件数据读取到 内存中 这个动作叫反序列化
        // 把内存中的数据写到硬盘上 这个动作叫序列化
        int type = parser.getEventType();// 0
        while (type != XmlPullParser.END_DOCUMENT) {
            // 获取标签名称
            String tagName = parser.getName();
            switch (type) {
            case XmlPullParser.START_TAG:// 开始标签事件
                if ("students".equals(tagName)) {
                    // 做了一些准备 工作 创建了一个集合 因为我要装javabean
                    list = new ArrayList<Student>();

                } else if ("student".equals(tagName)) {
                    // 创建javabean 对象
                    student = new Student();
                    // 获取id
                    String id = parser.getAttributeValue(0);// 从0数
                    student.setId(id);

                } else if ("name".equals(tagName)) {
                    // 获取标签之间的文本
                    // String text = parser.getText();//获取不到文本 注意这是个坑
                    String name = parser.nextText();// 获取标签之间的文本
                    student.setName(name);

                } else if ("age".equals(tagName)) {
                    String age = parser.nextText();// 获取标签之间的文本
                    student.setAge(age);

                } else if ("tel".equals(tagName)) {
                    String tel = parser.nextText();// 获取标签之间的文本
                    student.setTel(tel);
                }

                break;
            case XmlPullParser.END_TAG:// 结束标签事件
                if ("student".equals(tagName)) {
                    list.add(student);
                }
                break;

            }

            type = parser.next();// 让指针下移一行,获取到的新的事件类型,记得重新赋值给type 不然就会死循环

        }
        // type=parser.next();//让指针下一行
        // System.out.println(type);
        // System.out.println(XmlPullParser.START_DOCUMENT);//文档开始事件
        // System.out.println(XmlPullParser.END_DOCUMENT);//文档结束事件
        // System.out.println(XmlPullParser.START_TAG);// 开始标签事件
        // System.out.println(XmlPullParser.END_TAG);// 结束标签事件
        // System.out.println(list);
        // 现在的要求是我想把内存中的数据序列化到硬盘上去永久保存
        SavaDataToXMl(factory);

    }

    private static void SavaDataToXMl(XmlPullParserFactory factory) throws XmlPullParserException,
            IllegalArgumentException, IllegalStateException, FileNotFoundException, IOException {
        // 获取序列化器
        XmlSerializer serializer = factory.newSerializer();
        // 设置输出流关联xml文件
        serializer.setOutput(new FileOutputStream("stu.xml"), "utf-8");
        // 写入文档声明(文档开始)
        // 参数1:编码 参数2:文档是否独立
        // 有文档开始,也要有文档结束 注意成去写
        serializer.startDocument("utf-8", true);// standalone='yes' 文档是否独立
        // 写入根标签
        // 参数1 命名空间 一般给null 参数2 标签名称
        serializer.startTag(null, "students");// 写入开始标签
        // 循环从集合里面
        for (Student stu : list) {
            // 写入student标签
            serializer.startTag(null, "student");// 写入开始标签
            // 写入属性 参1 命名空间,参数2 属性名 参数3属性值
            serializer.attribute(null, "id", stu.getId());
            serializer.startTag(null, "name");// 写入开始标签
            // 写入标签直接的文本
            serializer.text(stu.getName());

            serializer.endTag(null, "name");// 写入结束标签
            serializer.startTag(null, "age");// 写入开始标签
            // 写入标签直接的文本
            serializer.text(stu.getAge());

            serializer.endTag(null, "age");// 写入结束标签
            serializer.startTag(null, "tel");// 写入开始标签
            // 写入标签直接的文本
            serializer.text(stu.getTel());

            serializer.endTag(null, "tel");// 写入结束标签

            serializer.endTag(null, "student");// 写入结束标签
        }

        serializer.endTag(null, "students");// 写入结束标签

        serializer.endDocument();

    }

}

原创粉丝点击