本文使用SAX来解析XML,在Android里面可以使用SAX和DOM两种方法来解析XML,DOM方法需要把整个XML文件读入内存再解析,比较消耗内存,而SAX基于事件驱动的处理方式,可以在各节点触发回调函数,不过SAX适合节点结构简单的XML文档,复杂的XML文档在后期的节点深度处理会有点麻烦。
本文要解析的test.xml文件如下:
1
2
3
4
5
6
7
8
|
<?
xml
version
=
"1.0"
encoding
"utf-8"
?>
<
test
>
title
>testSAX</
>
content
aa
"1"
bb
"2"
>
name
>hellogv</
>
</
content
>
>
|
解析如上XML的结果图如下:
使用SAX解析,需要定义SAXParserFactory(使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档),SAXParser(从各种输入源解析 XML),XMLReader(使用回调函数读取 XML 文档),其中XMLReader是个关键。XMLReader可以为解析XML定义各种回调函数,“条件符合”的时候触发这些回调函数。
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
reader.setContentHandler(handler);
reader.parse(
new
InputSource(testSAX.
this
.getResources()
.openRawResource(R.raw.test)));
在这段代码里,XMLReader就调用继承DefaultHandler的SAXHandler。DefaultHandler已实现ContentHandler,DTDHandler,EntityResolver,ErrorHandler等接口,包含常见读取XML的操作,具体请看下面的SAXHandler.java源码。
生成XML的结果如下:
上图是读取各节点之后,使用XmlSerializer重新组合并输出XML字符串。
main.xml代码:
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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/btnSAX"
"fill_parent"
"wrap_content"
android:text
"使用SAX解析xml"
/>
Button
"@+id/btnOutput"
"fill_parent"
"wrap_content"
"生成xml"
/>
EditText
"@+id/EditText01"
"fill_parent"
"fill_parent"
"@+id/EditText01"
/>
LinearLayout
SAXHandler.java代码:
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
package
com.testSAX;
import
java.util.ArrayList;
org.xml.sax.Attributes;
org.xml.sax.SAXException;
org.xml.sax.helpers.DefaultHandler;
android.util.Log;
public
class
SAXHandler
extends
DefaultHandler {
private
ArrayList<String> keys =
ArrayList<String>();
// 保存字段名称
ArrayList<Object> values =
ArrayList<Object>();
// 保存值
@Override
void
startDocument()
throws
SAXException {
super
.startDocument();
}
@Override
endDocument()
SAXException {
.endDocument();
}
@Override
startElement(String uri,String localName,String qName,
Attributes attributes)
SAXException {
// 保存开始标记
keys.add(
"startTag"
);
values.add(localName);
Log.e(
,localName);
// 保存属性值
for
(
int
i =
0
; i < attributes.getLength(); i++) {
"Attr"
);
String[] str =
String[
2
];
str[
] = attributes.getLocalName(i);
1
] = attributes.getValue(i);
values.add(str);
] +
"="
+ str[
]);
}
}
@Override
endElement(String uri,String qName)
SAXException {
// 保存结束标记
"endTag"
);
values.add(localName);
}
@Override
characters(
char
[] ch,
start,monospace!important; font-size:1em!important; min-height:inherit!important">length)
SAXException {
String value =
String(ch,start,length);
value = value.trim();
if
(value.length() ==
)
return
;
"text"
);
values.add(value);
}
public
ArrayList<String> GetKeys() {
keys;
}
ArrayList<Object> GetValues() {
values;
}
}
testSAX.java代码:
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
javax.xml.parsers.SAXParser;
javax.xml.parsers.SAXParserFactory;
org.xml.sax.InputSource;
org.xml.sax.XMLReader;
org.xmlpull.v1.XmlSerializer;
android.app.Activity;
android.os.Bundle;
android.util.Xml;
android.view.View;
android.widget.Button;
android.widget.EditText;
testSAX
Activity {
/** Called when the activity is first created. */
Button btnSAX,btnOutput;
EditText memo;
SAXHandler handler =
SAXHandler();
@Override
onCreate(Bundle savedInstanceState) {
.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnSAX = (Button)
.findViewById(R.id.btnSAX);
btnSAX.setOnClickListener(
ClickEvent());
btnOutput = (Button)
.findViewById(R.id.btnOutput);
btnOutput.setOnClickListener(
ClickEvent());
memo = (EditText)
.findViewById(R.id.EditText01);
}
ClickEvent
implements
View.OnClickListener {
@Override
onClick(View v) {
(v == btnSAX) {
// 解析xml,并保存标记,属性等值
try
{
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
reader.setContentHandler(handler);
.getResources()
.openRawResource(R.raw.test)));
}
catch
(Exception ee) {
}
else
(v == btnOutput) {
// 生成xml
{
XmlSerializer serializer = Xml.newSerializer();
StringWriter writer =
StringWriter();
{
serializer.setOutput(writer);
serializer.startDocument(
"UTF-8"
true
);
; i < handler.GetKeys().size(); i++) {
(handler.GetKeys().get(i).equals(
)) {
serializer.startTag(
""
.GetValues().get(i));
)) {
String[] str = (String[]) handler.GetValues()
.get(i);
serializer.attribute(
],monospace!important; font-size:1em!important; min-height:inherit!important">]);
))
serializer.text((String) handler.GetValues()
.get(i));
)) {
serializer.endTag(
.GetValues().get(i));
}
}
serializer.endDocument();
String text = writer.toString();
text = text.replace(
"><"
">/r/n<"
);
memo.setText(text);
// 输出到文本框
(Exception e) {
throw
RuntimeException(e);
}
(Exception e) {
}
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。