大家好今天我今天给大家讲解一下Android创建xml以及一些解析xml的常用方法。
首先是创建,我们用XmlSerializer这个类来创建一个xml文件,其次是解析xml文件,常用的有dom,sax,XmlPullParser等方法,由于sax代码有点复杂,本节只讲解一下dom与XmlPullParser解析,sax我将会在下一节单独讲解,至于几种解析xml的优缺点我就不再讲述了。
为了方便理解,我做了一个简单的Demo。首先首界面有三个按钮,点击第一个按钮会在sdcard目录下创建一个books.xml文件。另外两个按钮分别是调用dom与XmlPullParser方法解析xml文件,并将结果显示在一个TextView里。大家可以按照我的步骤一步步来:
第一步:新建一个Android工程,命名为XmlDemo
第二步:修改main.xml布局文件,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
LinearLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:orientation
=
"vertical"
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
>
<
Button
android:id
=
"@+id/btn1"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:text
=
"创建XML文件"
/>
<
Button
android:id
=
"@+id/btn2"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:text
=
"DOM解析XML"
/>
<
Button
android:id
=
"@+id/btn3"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:text
=
"XmlPullParse解析XML"
/>
<
TextView
android:id
=
"@+id/result"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
/>
</
LinearLayout
>
|
第三步:修改主核心程序XmlDemo.java,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
package
com.tutor.xml;
import
java.io.File;
import
java.io.FileNotFoundException;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
javax.xml.parsers.DocumentBuilder;
import
javax.xml.parsers.DocumentBuilderFactory;
import
javax.xml.parsers.ParserConfigurationException;
import
org.w3c.dom.Document;
import
org.w3c.dom.Element;
import
org.w3c.dom.NodeList;
import
org.xml.sax.SAXException;
import
org.xmlpull.v1.XmlPullParser;
import
org.xmlpull.v1.XmlPullParserException;
import
org.xmlpull.v1.XmlPullParserFactory;
import
org.xmlpull.v1.XmlSerializer;
import
android.app.Activity;
import
android.os.Bundle;
import
android.util.Log;
import
android.util.Xml;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.Button;
import
android.widget.TextView;
import
android.widget.Toast;
public
class
XmlDemo
extends
Activity
implements
OnClickListener {
private
static
final
String BOOKS_PATH =
"/sdcard/books.xml"
;
private
Button mButton1, mButton2, mButton3;
private
TextView mTextView;
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupViews();
}
// 初始化工作
private
void
setupViews() {
mTextView = (TextView) findViewById(R.id.result);
mButton1 = (Button) findViewById(R.id.btn1);
mButton2 = (Button) findViewById(R.id.btn2);
mButton3 = (Button) findViewById(R.id.btn3);
mButton1.setOnClickListener(
this
);
mButton2.setOnClickListener(
this
);
mButton3.setOnClickListener(
this
);
}
// 创建xml文件
private
void
createXmlFile() {
File linceseFile =
new
File(BOOKS_PATH);
try
{
linceseFile.createNewFile();
}
catch
(IOException e) {
Log.e(
"IOException"
,
"exception in createNewFile() method"
);
}
FileOutputStream fileos =
null
;
try
{
fileos =
new
FileOutputStream(linceseFile);
}
catch
(FileNotFoundException e) {
Log.e(
"FileNotFoundException"
,
"can't create FileOutputStream"
);
}
XmlSerializer serializer = Xml.newSerializer();
try
{
serializer.setOutput(fileos,
"UTF-8"
);
serializer.startDocument(
null
,
true
);
serializer.startTag(
null
,
"books"
);
for
(
int
i =
0
; i <
3
; i++) {
serializer.startTag(
null
,
"book"
);
serializer.startTag(
null
,
"bookname"
);
serializer.text(
"Android教程"
+ i);
serializer.endTag(
null
,
"bookname"
);
serializer.startTag(
null
,
"bookauthor"
);
serializer.text(
"Frankie"
+ i);
serializer.endTag(
null
,
"bookauthor"
);
serializer.endTag(
null
,
"book"
);
}
serializer.endTag(
null
,
"books"
);
serializer.endDocument();
serializer.flush();
fileos.close();
}
catch
(Exception e) {
Log.e(
"Exception"
,
"error occurred while creating xml file"
);
}
Toast.makeText(getApplicationContext(),
"创建xml文件成功!"
,
Toast.LENGTH_SHORT).show();
}
// dom解析xml文件
private
void
domParseXML() {
File file =
new
File(BOOKS_PATH);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db =
null
;
try
{
db = dbf.newDocumentBuilder();
}
catch
(ParserConfigurationException e) {
e.printStackTrace();
}
Document doc =
null
;
try
{
doc = db.parse(file);
}
catch
(SAXException e) {
e.printStackTrace();
}
catch
(IOException e) {
e.printStackTrace();
}
Element root = doc.getDocumentElement();
NodeList books = root.getElementsByTagName(
"book"
);
String res =
"本结果是通过dom解析:"
+
"/n"
;
for
(
int
i =
0
; i < books.getLength(); i++) {
Element book = (Element) books.item(i);
Element bookname = (Element) book.getElementsByTagName(
"bookname"
)
.item(
0
);
Element bookauthor = (Element) book.getElementsByTagName(
"bookauthor"
).item(
0
);
res +=
"书名: "
+ bookname.getFirstChild().getNodeValue() +
" "
+
"作者: "
+ bookauthor.getFirstChild().getNodeValue() +
"/n"
;
}
mTextView.setText(res);
}
// xmlPullParser解析xml文件
private
void
xmlPullParseXML() {
String res =
"本结果是通过XmlPullParse解析:"
+
"/n"
;
try
{
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(Thread.currentThread()
.getContextClassLoader().getResourceAsStream(BOOKS_PATH),
"UTF-8"
);
int
eventType = xmlPullParser.getEventType();
try
{
while
(eventType != XmlPullParser.END_DOCUMENT) {
String nodeName = xmlPullParser.getName();
switch
(eventType) {
case
XmlPullParser.START_TAG:
if
(
"bookname"
.equals(nodeName)) {
res +=
"书名: "
+ xmlPullParser.nextText() +
" "
;
}
else
if
(
"bookauthor"
.equals(nodeName)) {
res +=
"作者: "
+ xmlPullParser.nextText() +
"/n"
;
}
break
;
default
:
break
;
}
eventType = xmlPullParser.next();
}
}
catch
(IOException e) {
e.printStackTrace();
}
}
catch
(XmlPullParserException e) {
e.printStackTrace();
}
mTextView.setText(res);
}
// 按钮事件响应
public
void
onClick(View v) {
if
(v == mButton1) {
createXmlFile();
}
else
if
(v == mButton2) {
domParseXML();
}
else
if
(v == mButton3) {
xmlPullParseXML();
}
}
}
|
第四步:由于我们在Sd卡上新建了文件,需要增加权限,如下代码(第13行):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
manifest
xmlns:android
=
"http://schemas.android.com/apk/res/android"
package
=
"com.tutor.xml"
android:versionCode
=
"1"
android:versionName
=
"1.0"
>
<
application
android:icon
=
"@drawable/icon"
android:label
=
"@string/app_name"
>
<
activity
android:name
=
".XmlDemo"
android:label
=
"@string/app_name"
>
<
intent-filter
>
<
action
android:name
=
"android.intent.action.MAIN"
/>
<
category
android:name
=
"android.intent.category.LAUNCHER"
/>
</
intent-filter
>
</
activity
>
</
application
>
<
uses-sdk
android:minSdkVersion
=
"7"
/>
<
uses-permission
android:name
=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
</
manifest
>
|
第五步:运行上述工程,查看效果:
启动首界面:
点击创建XML文件按钮,生成books.xml文件
books.xml内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?
xml
version
=
'1.0'
encoding
=
'UTF-8'
standalone
=
'yes'
?>
<
books
>
<
book
>
<
bookname
>Android教程0</
bookname
>
<
bookauthor
>Frankie0</
bookauthor
>
</
book
>
<
book
>
<
bookname
>Android教程1</
bookname
>
<
bookauthor
>Frankie1</
bookauthor
>
</
book
>
<
book
>
<
bookname
>Android教程2</
bookname
>
<
bookauthor
>Frankie2</
bookauthor
>
</
book
>
</
books
>
|
点击DOM解析XML按钮:
点击XmlPullParse解析XML按钮:
Ok~今天就先讲到这里。thx~