Android-XML解析

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>
  1. 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()
        }


    }
  1. 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()
    }


}
  1. DOM解析,不常用不做分析

注释都很完整了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值