5.2 XML
5.2.1.XML的解析简介
1、常见的XML解析方式有三种,DOM、SAX、Pull,Android系统中推荐使用Pull
2、 Pull解析器是一个开源的Java项目,Android系统内部解析XML文件均为此种方式,也可用于JavaEE项目
3、 Android SDK中已经集成了Pull解析器,无需添加任何jar文件
4、 Pull解析器运行方式与SAX类似,提供各种事件的判断
5、 官方网站:http://xmlpull.org/
5.2.2使用Pull解析器解析XML文件
1、Xml.newPullParser() 获得解析器
2、 parser.setInput(in, "UTF-8") 设置输入流以及编码
3、 parser.getEventType() 获取解析到当前的一个事件代码
4、parser.next() 获取下一个解析事件,得到一个事件代码
5、 XmlPullParser中定义了常量来标识各种解析事件
START_DOCUMENT、END_DOCUMENT 、START_TAG 、END_TAG 、TEXT
5.2.3 使用XmlSerializer写出XML
1、 Xml.newSerializer() 获得XML持久序列对象
2、使用以下方法生成XML,和XML文档顺序类似
startDocument
startTag
attribute
text
endTag
endDocument
5.2.4 XML读写示例代码:
public void testReadFile() throws Exception{
List<Book> books = new ArrayList<Book>();
Book b = null;
XmlPullParser parser = Xml.newPullParser(); //获取XmlPull解析器
InputStream in = getContext().openFileInput("books.xml");
parser.setInput(in, "utf-8");
//循环的第一个参数是获取当然事件代码,接着是第二参数将当前事件代码与文档结束事件代码判断是否要结果。
//第三参数是循环一次结整个后执行解析文档下一步以获得下个事件的代码。
for(int eventType= parser.getEventType();
eventType != XmlPullParser.END_DOCUMENT;eventType=parser.next()){
if(eventType==XmlPullParser.START_TAG){
if("书".equals(parser.getName())){ //书开始了,则New Book出来
b = new Book();
books.add(b);
String category = parser.getAttributeValue(null, "分类"); //获取书标签中,分类属性的值
b.setCategory(category);
String publisher = parser.getAttributeValue(null, "出版社");
b.setPublisher(publisher);
}else if("书名".equals(parser.getName())){
b.setName(parser.nextText()); //parser.nextText即将当前标签的下一个节点对象(Text)文本值设置进name中。
}else if("作者".equals(parser.getName())){
b.setAuthor(parser.nextText());
}else if("售价".equals(parser.getName())){
b.setPrice(Float.valueOf(parser.nextText()));
}
}
}
in.close();
for (Book book : books) {
System.out.println(book);
}
//手动加个测试对象中去,以便写入文件
books.add(new Book("小说","李卫当官","未知",65f,"北大"));
testsaveFile(books);
}
private void testsaveFile(List<Book> books) throws Exception{
OutputStream out = getContext().openFileOutput("books.xml", Context.MODE_PRIVATE); //获取输出流
XmlSerializer xs = Xml.newSerializer(); //获取Xml的持久序列对象XmlSerializer对象
xs.setOutput(out, "utf-8");
xs.startDocument("utf-8", true); //开启文档
xs.startTag(null, "books"); //标签开始
for (Book book : books) {
xs.startTag(null, "book");
if(null != book.getPublisher())
xs.attribute(null, "pulisher",book.getPublisher());
if(null != book.getCategory())
xs.attribute(null, "category", book.getCategory());
xs.startTag(null, "name");
xs.text(book.getName());
xs.endTag(null, "name");
xs.startTag(null, "author");
xs.text(book.getAuthor());
xs.endTag(null, "author");
xs.startTag(null, "price");
xs.text(book.getPrice()+"");
xs.endTag(null, "price");
xs.endTag(null, "book");
}
xs.endTag(null, "books");//标签结束
xs.endDocument(); //结束文档
out.close();
}