本文使用SAX来解析XML,在Android里面可以使用SAX和DOM,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</ title > < content aa = "1" bb = "2" > < name >hellogv</ name > < url >http://blog.csdn.net/hellogv</ url > </ content > </ test > |
使用SAX解析,需要定义SAXParserFactory(使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档),SAXParser(从各种输入源解析 XML),XMLReader(使用回调函数读取 XML 文档),其中XMLReader是个关键。XMLReader可以为解析XML定义各种回调函数,“条件符合”的时候触发这些回调函数。
1
2
3
4
5
6
|
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源码。
读取各节点之后,使用XmlSerializer重新组合并输出XML字符串。本文的main.xml代码如下:
1
2
3
4
5
6
7
8
9
10
11
|
android:orientation = "vertical" android:layout_width = "fill_parent" android:layout_height = "fill_parent" > < button android:layout_height = "wrap_content" android:layout_width = "fill_parent" android:id = "@+id/btnSAX" android:text = "使用SAX解析XML" > < button android:layout_height = "wrap_content" android:layout_width = "fill_parent" android:text = "生成XML" android:id = "@+id/btnOutput" > < edittext android:text = "@+id/EditText01" android:id = "@+id/EditText01" android:layout_width = "fill_parent" android:layout_height = "fill_parent" > |
testSAX.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
|
package com.testSAX; import java.io.StringWriter; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import org.xmlpull.v1.XmlSerializer; import android.app.Activity; import android.os.Bundle; import android.util.Xml; import android.view.View; import android.widget.Button; import android.widget.EditText; public class testSAX extends Activity { /** Called when the activity is first created. */ Button btnSAX, btnOutput; EditText memo; SAXHandler handler = new SAXHandler(); @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); btnSAX = (Button) this .findViewById(R.id.btnSAX); btnSAX.setOnClickListener( new ClickEvent()); btnOutput = (Button) this .findViewById(R.id.btnOutput); btnOutput.setOnClickListener( new ClickEvent()); memo = (EditText) this .findViewById(R.id.EditText01); } class ClickEvent implements View.OnClickListener { @Override public void onClick(View v) { if (v == btnSAX) { //解析XML,并保存标记,属性等值 try { 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))); } catch (Exception ee) {} } else if (v == btnOutput) { //生成XML try { XmlSerializer serializer = Xml.newSerializer(); StringWriter writer = new StringWriter(); try { serializer.setOutput(writer); serializer.startDocument( "UTF-8" , true ); for ( int i= 0 ;i<handler.getkeys().size();i++) { if (handler.GetKeys().get(i).equals( "startTag" )) { serializer.startTag( "" , (String) handler.GetValues().get(i)); } else if (handler.GetKeys().get(i).equals( "Attr" )){ String[] str= (String[]) handler.GetValues().get(i); serializer.attribute( "" ,str[ 0 ],str[ 1 ]); } else if (handler.GetKeys().get(i).equals( "text" )) serializer.text((String)handler.GetValues().get(i)); else if (handler.GetKeys().get(i).equals( "endTag" )) { serializer.endTag( "" , (String) handler.GetValues().get(i)); } } serializer.endDocument(); String text=writer.toString(); text=text.replace( "><" , ">/r/n<" ); memo.setText(text); //输出到文本框 } catch (Exception e) { throw new RuntimeException(e); } } catch (Exception e) {} } } } } |
PS:服务器之家推荐一款在线XML格式化工具:https://tool.zzvips.com/t/xml/
以上就是本文的全部内容,希望对大家的学习有所帮助。