Android-XML解析
常用解析方式(直接上代码没什么好讲的)
本例直接从assets文件中读取xml文件。
<apps>
<app>
<id>1</id>
<name>Google Maps</name>
<version>1.0</version>
</app>
<app>
<id>2</id>
<name>Chrome</name>
<version>2.1</version>
</app>
<app>
<id>3</id>
<name>Google Play</name>
<version>2.3</version>
</app>
</apps>
- Pull解析
private fun parseXMLWithPull(inputStream: InputStream?) {
//Log.e("wdl", data)
// Step 1
// 获取XmlPullParseFactory
val xmlPullParseFactory = XmlPullParserFactory.newInstance()
// Step 2
// 获取XmlPullParse
val xmlPullParser = xmlPullParseFactory.newPullParser()
// Step 3
// 设置要解析的内容
xmlPullParser.setInput(InputStreamReader(inputStream))
// Step 4
// 获取标签事件类型
// * @see # isEmptyElementTag
// * @see # START_TAG
// * @see # TEXT
// * @see # END_TAG
// * @see # END_DOCUMENT
var eventType = xmlPullParser.eventType
var id = ""
var name = ""
var version = ""
while (eventType != XmlPullParser.END_DOCUMENT) {
// 节点名称
val nodeName = xmlPullParser.name
Log.e("wdl", "nodeName is $nodeName")
when (eventType) {
XmlPullParser.START_TAG -> {
when (nodeName) {
"id" -> id = xmlPullParser.nextText()
"name" -> name = xmlPullParser.nextText()
"version" -> version = xmlPullParser.nextText()
}
}
XmlPullParser.END_TAG -> {
if (nodeName == "app") {
Log.e("wdl", "ID is $id \n NAME is $name \n VERSION is $version")
}
}
}
// 指向下一个标签
eventType = xmlPullParser.next()
}
}
- SAX解析
private fun parseXMLWithSax(inputStream: InputStream?) {
// Step 1
// 获取SAXParseFactory
val saxParserFactory = SAXParserFactory.newInstance()
// Step 2
// 获取XMLReader
val xmlReader = saxParserFactory.newSAXParser().xmlReader
// Step 3
// 实例化handler并设置给xmlReader
val handler = ContentHandler()
xmlReader.contentHandler = handler
// Step 4
// 执行解析
xmlReader.parse(InputSource(inputStream))
}
其中contentHandler为继承自DefaultHandler的类:
package com.wdl.xml_json
import android.util.Log
import org.xml.sax.Attributes
import org.xml.sax.helpers.DefaultHandler
import java.lang.StringBuilder
/**
* 项目名: XML_JSON
* 包名: com.wdl.xml_json
* 创建时间: 2019/6/24 11:29
* 描述: TODO
*/
class ContentHandler : DefaultHandler() {
private var nodeName: String? = ""
private lateinit var id: StringBuilder
private lateinit var name: StringBuilder
private lateinit var version: StringBuilder
// 开始解析XML文件时调用
override fun startDocument() {
super.startDocument()
id = StringBuilder("")
name = StringBuilder("")
version = StringBuilder("")
}
// 开始解析某个节点时调用
override fun startElement(uri: String?, localName: String?, qName: String?, attributes: Attributes?) {
super.startElement(uri, localName, qName, attributes)
nodeName = localName
}
// characters()方法会在获取节点中的内容的时候调用
override fun characters(ch: CharArray?, start: Int, length: Int) {
super.characters(ch, start, length)
when (nodeName) {
"id" -> id.append(ch, start, length)
"name" -> name.append(ch, start, length)
"version" -> version.append(ch, start, length)
}
}
// 某个节点完成解析时
override fun endElement(uri: String?, localName: String?, qName: String?) {
super.endElement(uri, localName, qName)
if (localName == "app") {
Log.e(
"wdl",
"ContentHandler id is $id \n ContentHandler name is $name \n ContentHandler version is $version \n"
)
id.setLength(0)
name.setLength(0)
version.setLength(0)
}
}
// XML文件解析完成时调用
override fun endDocument() {
super.endDocument()
}
}
- DOM解析,不常用不做分析