Почему XmlResourceParser, полученный из getXml (), застрял в строке -1? - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь проанализировать файл ресурсов XML, который находится на res > xml > my_file.xml.Кажется, он застрял в строке -1, и я не совсем понимаю, почему это так.

Вот код:

class SPXMLParser(val context: Context){

    fun parse(): MutableList<Node> {
        Log.d("PONY", "We are inside SPXMLParser.parse()")
        val parser = context.resources.getXml(R.xml.my_file)
        Log.d("PONY", "Parser created text: ${parser.text} Parser line: ${parser.lineNumber}")
        return readFeed(parser)
    }

    private fun readFeed(parser: XmlPullParser): MutableList<Node> {
        Log.d("PONY", "Inside readFeed")
        val entries = mutableListOf<Node>()
        Log.d("PONY", "Before while text: ${parser.text} Parser line: ${parser.lineNumber}")
        while (parser.eventType != XmlPullParser.END_DOCUMENT) {
            Log.d("PONY", "While condition met text: ${parser.text} Parser line: ${parser.lineNumber}")
            val name = parser.name
            // Starts by looking for the entry tag
            if (name == "node") {
                entries.add(readEntry(parser))
            } else {
                skip(parser)
            }
            parser.next()
        }
        Log.d("PONY", "Before returning from readFeed")
        return entries
    }
// ...
    private fun skip(parser: XmlPullParser) {
        Log.d("PONY", "Inside skip function")
        if (parser.eventType != XmlPullParser.START_TAG) {
            Log.d("PONY", "About to throw up")
            throw IllegalStateException()
        }
        var depth = 1
        while (depth != 0) {
            Log.d("PONY", "Inception loop")
            when (parser.next()) {
                XmlPullParser.END_TAG -> depth--
                XmlPullParser.START_TAG -> depth++
            }
        }
        Log.d("PONY", "Exit skip function")
    }
}

А вот что мы можем прочитать в logcat:

06-01 15:51:01.972 12030-12030/com.example.learningtoparse D/PONY: We are inside onCreate
06-01 15:51:01.981 12030-12030/com.example.learningtoparse D/PONY: Parser has been created
    We are inside SPXMLParser.parse()
06-01 15:51:01.982 12030-12030/com.example.learningtoparse D/PONY: Parser created text: null Parser line: -1
    Inside readFeed
    Before while text: null Parser line: -1
    While condition met text: null Parser line: -1
    Else condition
    Inside skip function
    About to throw up

Чего мне не хватает?Почему строка -1?

РЕДАКТИРОВАТЬ: выложил функцию skip() и обновил следы журнала.Я знаю, что приложение останавливается, потому что выбрасывается необработанное исключение IllegalStateException, но вопрос о том, почему анализатор находится в строке "-1", все еще остается.

EDIT2: Я нашел этот вопрос, который можетбыть связанным с моим .Тем не менее, ответ кажется немного неубедительным.У меня также есть пролог XML в моем файле:

<?xml version="1.0" encoding="UTF-8"?>

На этом ответе предлагается, что Пролог XML читается, но мы все еще в событии START_DOCUMENT, так как корневой тег не имеетбыло прочитано еще.

...