Android入门(5) XML

5.2 XML

5.2.1.XML的解析简介

1、常见的XML解析方式有三种,DOMSAXPullAndroid系统中推荐使用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_DOCUMENTEND_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();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值