Я пытался реализовать Xml Parser в Kotlin, в Android Studio, но я столкнулся с исключением:
Exception in thread "main" java.lang.RuntimeException: Stub!
at android.util.Xml.newPullParser(Xml.java:60)"
Однако в моем коде мне никогда не нужно работать на смартфон или любое устройство. Я заглянул в файл «Xml. java», и оказалось, что библиотека libcore помечена как неразрешенная ссылка: import libcore.util.XmlObjectFactory;
говорит, что «не может разрешить символ« libcore »».
Там мой код:
class XmlParser {
//We instantiate the parser
@Throws(XmlPullParserException::class, IOException::class)
fun parse(inputStream: InputStream): List<*> {
inputStream.use { inputStream ->
val parser: XmlPullParser = newPullParser()
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)
parser.setInput(inputStream, null)
parser.nextTag()
return readResources(parser)
}
}
//We create a function that is able to read an xml file with root:"resources"
private fun readResources(parser: XmlPullParser): List<SuperRepository> {
val resources = mutableListOf<SuperRepository>()
parser.require(XmlPullParser.START_TAG, ns, "resources")
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.eventType != XmlPullParser.START_TAG) {
continue
}
// Starts by looking for the entry tag
if (parser.name == "SurRecueil") {
resources.add(readSuperRepository(parser))
} else {
skip(parser)
}
}
return resources
}
private fun readSuperRepository(parser: XmlPullParser): SuperRepository {
val listOfRepository = mutableListOf<Repository>()
parser.require(XmlPullParser.START_TAG, ns, "SurRecueil")
val title = parser.getAttributeValue(null, "titre")
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.eventType != XmlPullParser.START_TAG) {
continue
}
// Starts by looking for the entry tag
if (parser.name == "Recueil") {
listOfRepository.add(readRepository(parser))
} else {
skip(parser)
}
}
listOfRepository.toList()
return SuperRepository(title, listOfRepository)
}
private fun readRepository(parser: XmlPullParser): Repository {
val listOfSongs = mutableListOf<Song>()
parser.require(XmlPullParser.START_TAG, ns, "Recueil")
val title = parser.getAttributeValue(null, "titre")
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.eventType != XmlPullParser.START_TAG) {
continue
}
// Starts by looking for the entry tag
if (parser.name == "Chanson") {
listOfSongs.add(readSong(parser))
} else {
skip(parser)
}
}
listOfSongs.toList()
return Repository(title, listOfSongs)
}
@Throws(IOException::class, XmlPullParserException::class)
private fun readSong(parser: XmlPullParser): Song {
parser.require(XmlPullParser.START_TAG, ns, "Chanson")
val title = parser.getAttributeValue(null, "titre")
val author = parser.getAttributeValue(null, "auteur")
val lyrics = readText(parser)
parser.require(XmlPullParser.END_TAG, ns, "Chanson")
return Song(title, author, lyrics)
}
private fun readText(parser: XmlPullParser) : String {
var result = ""
if (parser.next() == XmlPullParser.TEXT) {
result = parser.text
parser.nextTag()
}
return result
}
@Throws(XmlPullParserException::class, IOException::class)
private fun skip(parser: XmlPullParser) {
if (parser.eventType != XmlPullParser.START_TAG) {
throw IllegalStateException()
}
var depth = 1
while (depth != 0) {
when (parser.next()) {
XmlPullParser.END_TAG -> depth--
XmlPullParser.START_TAG -> depth++
}
}
}
}
И:
fun main(){
val fileName = "testxml.xml"
val p = XmlParser()
println(p.parse(File(fileName).inputStream()))
Знаете ли вы, как решить эту проблему?