public class PullParserDemo {
private static ArrayList<Student> list;
private static Student student;
// 导入第三方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();
}
}
private static ArrayList<Student> list;
private static Student student;
public static void main(String[] args) throws Exception {
首先都要先获取解析器对象
// 导入第三方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();
}
}