Android中解析XML方法详解.docx
- 文档编号:29886347
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:26
- 大小:65.31KB
Android中解析XML方法详解.docx
《Android中解析XML方法详解.docx》由会员分享,可在线阅读,更多相关《Android中解析XML方法详解.docx(26页珍藏版)》请在冰豆网上搜索。
Android中解析XML方法详解
XML在各种开发中都广泛应用,Android也不例外。
作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能。
今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建的方法。
在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器,下面,我将一一向大家详细介绍。
SAX解析器:
SAX(SimpleAPIforXML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。
当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。
在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。
SAX解析器的优点是解析速度快,占用内存少。
非常适合在Android移动设备中使用。
DOM解析器:
DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOMAPI遍历XML树、检索所需数据。
分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。
由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。
但是对于特别大的文档,解析和加载整个文档将会很耗资源。
PULL解析器:
PULL解析器的运行方式和SAX类似,都是基于事件的模式。
不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。
PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。
以上三种解析器,都是非常实用的解析器,我将会一一介绍。
我们将会使用这三种解析技术完成一项共同的任务。
我们新建一个项目,项目结构如下:
我会在项目的assets目录中放置一个XML文档books.xml,内容如下:
[xhtml] viewplaincopy
1.
xml version="1.0" encoding="utf-8"?
>
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
然后我们分别使用以上三种解析技术解析文档,得到一个List
[java] viewplaincopy
1.package com.scott.xml.model;
2.
3.public class Book {
4. private int id;
5. private String name;
6. private float price;
7.
8. public int getId() {
9. return id;
10. }
11.
12. public void setId(int id) {
13. this.id = id;
14. }
15.
16. public String getName() {
17. return name;
18. }
19.
20. public void setName(String name) {
21. this.name = name;
22. }
23.
24. public float getPrice() {
25. return price;
26. }
27.
28. public void setPrice(float price) {
29. this.price = price;
30. }
31.
32. @Override
33. public String toString() {
34. return "id:
" + id + ", name:
" + name + ", price:
" + price;
35. }
36.}
最后,我们还要把这个集合对象中的数据生成一个新的XML文档,如图:
生成的XML结构跟原始文档略有不同,是下面这种格式:
[xhtml] viewplaincopy
1.
xml version="1.0" encoding="UTF-8"?
>
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
接下来,就该介绍操作过程了,我们先为解析器定义一个BookParser接口,每种类型的解析器需要实现此接口。
BookParser.java代码如下:
[java] viewplaincopy
1.package com.scott.xml.parser;
2.
3.import java.io.InputStream;
4.import java.util.List;
5.
6.import com.scott.xml.model.Book;
7.
8.public interface BookParser {
9. /**
10. * 解析输入流 得到Book对象集合
11. * @param is
12. * @return
13. * @throws Exception
14. */
15. public List
16.
17. /**
18. * 序列化Book对象集合 得到XML形式的字符串
19. * @param books
20. * @return
21. * @throws Exception
22. */
23. public String serialize(List
24.}
好了,我们就该一个一个的实现该接口,完成我们的解析过程。
使用SAX解析器:
SaxBookParser.java代码如下:
[c-sharp] viewplaincopy
1.package com.scott.xml.parser;
2.
3.import java.io.InputStream;
4.import java.io.StringWriter;
5.import java.util.ArrayList;
6.import java.util.List;
7.
8.import javax.xml.parsers.SAXParser;
9.import javax.xml.parsers.SAXParserFactory;
10.import javax.xml.transform.OutputKeys;
11.import javax.xml.transform.Result;
12.import javax.xml.transform.Transformer;
13.import javax.xml.transform.TransformerFactory;
14.import javax.xml.transform.sax.SAXTransformerFactory;
15.import javax.xml.transform.sax.TransformerHandler;
16.import javax.xml.transform.stream.StreamResult;
17.
18.import org.xml.sax.Attributes;
19.import org.xml.sax.SAXException;
20.import org.xml.sax.helpers.AttributesImpl;
21.import org.xml.sax.helpers.DefaultHandler;
22.
23.import com.scott.xml.model.Book;
24.
25.public class SaxBookParser implements BookParser {
26.
27. @Override
28. public List
29. SAXParserFactory factory = SAXParserFactory.newInstance(); //取得SAXParserFactory实例
30. SAXParser parser = factory.newSAXParser(); //从factory获取SAXParser实例
31. MyHandler handler = new MyHandler(); //实例化自定义Handler
32. parser.parse(is, handler); //根据自定义Handler规则解析输入流
33. return handler.getBooks();
34. }
35.
36. @Override
37. public String serialize(List
38. SAXTransformerFactory factory = (SAXTransformerFactory) TransformerFactory.newInstance();//取得SAXTransformerFactory实例
39. TransformerHandler handler = factory.newTransformerHandler(); //从factory获取TransformerHandler实例
40. Transformer transformer = handler.getTransformer(); //从handler获取Transformer实例
41. transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); // 设置输出采用的编码方式
42. transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // 是否自动添加额外的空白
43. transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); // 是否忽略XML声明
44.
45. StringWriter writer = new StringWriter();
46. Result result = new StreamResult(writer);
47. handler.setResult(result);
48.
49. String uri = ""; //代表命名空间的URI 当URI无值时 须置为空字符串
50. String localName = ""; //命名空间的本地名称(不包含前缀) 当没有进行命名空间处理时 须置为空字符串
51.
52. handler.startDocument();
53. handler.startElement(uri, localName, "books", null);
54.
55. AttributesImpl attrs = new AttributesImpl(); //负责存放元素的属性信息
56. char[] ch = null;
57. for (Book book :
books) {
58. attrs.clear(); //清空属性列表
59. attrs.addAttribute(uri, localName, "id", "string", String.valueOf(book.getId()));//添加一个名为id的属性(type影响不大,这里设为string)
60. handler.startElement(uri, localName, "book", attrs); //开始一个book元素 关联上面设定的id属性
61.
62. handler.startElement(uri, localName, "name", null); //开始一个name元素 没有属性
63. ch = String.valueOf(book.getName()).toCharArray();
64. handler.characters(ch, 0, ch.length); //设置name元素的文本节点
65. handler.endElement(uri, localName, "name");
66.
67. handler.startElement(uri, localName, "price", null);//开始一个price元素 没有属性
68. ch = String.valueOf(book.getPrice()).toCharArray();
69. handler.characters(ch, 0, ch.length); //设置price元素的文本节点
70. handler.endElement(uri, localName, "price");
71.
72. handler.endElement(uri, localName, "book");
73. }
74. handler.endElement(uri, localName, "books");
75. handler.endDocument();
76.
77. return writer.toString();
78. }
79.
80. //需要重写DefaultHandler的方法
81. private class MyHandler extends DefaultHandler {
82.
83. private List
84. private Book book;
85. private StringBuilder builder;
86.
87. //返回解析后得到的Book对象集合
88. public List
89. return books;
90. }
91.
92. @Override
93. public void startDocument() throws SAXException {
94. super.startDocument();
95. books = new ArrayList
96. builder = new StringBuilder();
97. }
98.
99. @Override
100. public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
101. super.startElement(uri, localName, qName, attributes);
102. if (localName.equals("book")) {
103. book = new Book();
104. }
105. builder.setLength(0); //将字符长度设置为0 以便重新开始读取元素内的字符节点
106. }
107.
108. @Override
109. public void characters(char[] ch, int start, int length) throws SAXException {
110. super.characters(ch, start, length);
111. builder.append(ch, start, length); //将读取的字符数组追加到builder中
112. }
113.
114. @Override
115. public void endElement(String uri, String localName, String qName) throws SAXException {
116. super.endElement(uri, localName, qName);
117. if (localName.equals("id")) {
118. book.setId(Integer.parseInt(builder.toString()));
119. } else if (localName.equals("name")) {
120. book.setName(builder.toString());
121. } else if (localName.equals("price")) {
122. book.setPrice(Float.parseFloat(builder.toString()));
123. } else if (localName.equals("book")) {
124. books.add(book);
125. }
126. }
127. }
128.}
代码中,我们定义了自己的事件处理逻辑,重写了DefaultHandler的几个重要的事件方法。
下面我为大家着重介绍一下DefaultHandler的相关知识。
DefaultHandler是一个事件处理器,可以接收解析器报告的所有事件,处理所发现的数据。
它实现了EntityResolve
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 解析 XML 方法 详解