使用Pull解析器生成XML文件

有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器。

使用Pull解析器生成一个与itcast.xml文件内容相同的myitcast.xml文件,代码在本页下方备注

使用代码如下(生成XML文件):
File xmlFile = new File("myitcast.xml");
FileOutputStream outStream = new FileOutputStream(xmlFile);
OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream, "UTF-8");
BufferedWriter writer = new BufferedWriter(outStreamWriter);
writeXML(persons, writer);
writer.flush();
writer.close();
如果只想得到生成的xml字符串内容,可以使用StringWriter:
StringWriter writer = new StringWriter();
writeXML(persons, writer);
String content = writer.toString();

Pull解析器生成的xml文件如下

文件名称:itcast.xml
<?xml version="1.0" encoding="UTF-8"?>
<persons>
 <person id="23">
  <name>liming</name>
  <age>30</age>
 </person>
 <person id="20">
  <name>lixiangmei</name>
  <age>25</age>
 </person>
</persons>

具体的方法是:

在包下新建一个person类,主要用于存放上面解析出来的xml内容,javaBean在MVC设计模型中是model,又称模型层,在一般的程序中,我们称它为数据层,就是用来设置数据的属性和一些行为,然后我会提供获取属性和设置属性的get/set方法

具体代码如下:

View Code
 1 package cn.itcast.domain;
2
3 public class Person {
4 private Integer id;
5 private String name;
6 private Short age;
7
8 public Person(){}
9
10 public Person(Integer id, String name, Short age) {
11 this.id = id;
12 this.name = name;
13 this.age = age;
14 }
15
16 public Integer getId() {
17 return id;
18 }
19 public void setId(Integer id) {
20 this.id = id;
21 }
22 public String getName() {
23 return name;
24 }
25 public void setName(String name) {
26 this.name = name;
27 }
28 public Short getAge() {
29 return age;
30 }
31 public void setAge(Short age) {
32 this.age = age;
33 }
34 @Override
35 public String toString() {
36 return "Person [age=" + age + ", id=" + id + ", name=" + name + "]";
37 }
38
39 }

第二步:新建一个package cn.itcast.service包,在包下新建一个SAXPersonService类,这个就是MVC里的M,业务类,主要代码如下

View Code
 1 public class PULLPersonService {
2
3 public static void save(List<Person> persons, Writer writer) throws Throwable{
4 XmlSerializer serializer = Xml.newSerializer();//得到一个序列化对象
5 serializer.setOutput(writer);//指定序列化对象文件输出方向,写入器
6 serializer.startDocument("UTF-8", true);//生成开始文档
7 //开始元素节点,第一个参数是命名空间名称,第二个参数为标签名称
8 serializer.startTag(null, "persons");
9 for(Person person : persons){
10 serializer.startTag(null, "person");//开始元素节点,第一个参数是命名空间名称,第二个参数为标签名称
11 serializer.attribute(null, "id", person.getId().toString());//得到person节点内的属性
12
13 serializer.startTag(null, "name");//开始元素节点,第一个参数是命名空间名称,第二个参数为标签名称
14 serializer.text(person.getName());//得到name节点里的内容
15 serializer.endTag(null, "name");//结束元素节点,第一个参数是命名空间名称,第二个参数为标签名称
16
17 serializer.startTag(null, "age");//开始元素节点,第一个参数是命名空间名称,第二个参数为标签名称
18 serializer.text(person.getAge().toString());//得到age节点里的内容
19 serializer.endTag(null, "age");//结束元素节点,第一个参数是命名空间名称,第二个参数为标签名称
20
21 serializer.endTag(null, "person");//结束元素节点,第一个参数是命名空间名称,第二个参数为标签名称
22 }
23 //结束元素节点,第一个参数是命名空间名称,第二个参数为标签名称
24 serializer.endTag(null, "persons");
25 serializer.endDocument();//生成结束文档
26 writer.flush();
27 writer.close();
28 }
29 }

第三步:在主包下新建一个PersonServiceTest类,这个类相当与mvc中的c(控制层),主要是对PULLPersonService这个类的save()方法进行单元测试,具体代码

View Code
 
这个app潮流公众帐号主要是推荐给手机用户最近最潮的软件,让大家随时跟上时尚。我们会提供给你们最好的服务,喜欢我们就帮我们推荐吧!
 1 public class PersonServiceTest extends AndroidTestCase {
2 private static final String TAG = "PersonServiceTest";
3 public void testSave() throws Throwable{
4 //File file = new File(this.getContext().getFilesDir(), "person.xml");//存放在手机的当前目录下
5 //FileOutputStream outStream = new FileOutputStream(file);
6 List<Person> persons = new ArrayList<Person>();
7 persons.add(new Person(34, "lili", (short)12));
8 persons.add(new Person(56, "老毕", (short)32));
9 persons.add(new Person(39, "老张", (short)40));
10 //存放在手机的当前目录下,模式为私有的
11 FileOutputStream outStream = this.getContext().openFileOutput("person.xml", Context.MODE_PRIVATE);
12 OutputStreamWriter writer = new OutputStreamWriter(outStream, "UTF-8");
13 BufferedWriter bWriter = new BufferedWriter(writer);
14 PULLPersonService.save(persons, bWriter);
15
16 // StringWriter writer = new StringWriter();//送往内存
17 // PULLPersonService.save(persons, writer);
18 // Log.i(TAG, writer.toString());
19 }
20 }
原文地址:https://www.cnblogs.com/shaoyangjiang/p/2390023.html