XML Reader in Kotlin

Viewed 333

I am trying to make a music player and need to save the last played song and the position of it. I have an .xml file for that in my assets folder and now I try to parse it, but I don't fully understand how it works. Here is my Code:

XML File:

<?xml version="1.0" encoding="utf-8"?>
<resources>
        <string name="position" Text="0" />
        <string name="song" Text="0" />
</resources>

Kotlin Code:

private val ns: String? = null
data class Entry(val length: String?, val songNumber: String?)

@Throws(XmlPullParserException::class, IOException::class)
fun parse(inputStream: InputStream): List<*> {

    inputStream.use { inputStream ->
        val parser: XmlPullParser = Xml.newPullParser()
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)
        parser.setInput(inputStream, null)
        parser.nextTag()
        return readFeed(parser)
    }
}

@Throws(XmlPullParserException::class, IOException::class)
fun readFeed(parser: XmlPullParser): List<Entry> {
    val entries = mutableListOf<Entry>()

    var songNumber: String? = null
    var length: String? = null

    parser.require(XmlPullParser.START_TAG, ns, "resources")
    repeat(2) {
        when (parser.name) {
            "position" -> length = readLength(parser)
            "song" -> songNumber = readSong(parser)
        }
    }
    entries.add(Entry(length, songNumber))
    return entries
}

// Processes title tags in the feed.
@Throws(IOException::class, XmlPullParserException::class)
fun readLength(parser: XmlPullParser): String {
    parser.require(XmlPullParser.START_TAG, ns, "position")
    val length:String = readText(parser)
    parser.require(XmlPullParser.END_TAG, ns, "position")
    return length
}

@Throws(IOException::class, XmlPullParserException::class)
fun readSong(parser: XmlPullParser): String {
    parser.require(XmlPullParser.START_TAG, ns, "song")
    val songNumber = readText(parser)
    parser.require(XmlPullParser.END_TAG, ns, "song")
    return songNumber
}

// For the tags title and summary, extracts their text values.
@Throws(IOException::class, XmlPullParserException::class)
fun readText(parser: XmlPullParser): String {
    var result = ""
    if (parser.next() == XmlPullParser.TEXT) {
        result = parser.text
        parser.nextTag()
    }
    return result
}

I can't figure out why it doesn't get the value. Where's my problem?

0 Answers
Related