XmlPullParser 使用 Kotlin 读取标签内的值
XmlPullParser Read value inside a Tag with Kotlin
我有以下 rss:https://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml 我可以毫无问题地阅读所有信息,但只有一个标签:
<media:content height="151" medium="image" url="https://someurl.jpg" width="151"/>
我需要此标签中的 url,但我不知道如何从标签中获取信息。其余信息在两个标签之间,所以没有问题,但这个信息在标签本身上。
我的解析函数是这样的
fun parse(inputStream: InputStream): List<RssItem> {
try {
val factory = XmlPullParserFactory.newInstance()
factory.isNamespaceAware = true
val parser = factory.newPullParser()
parser.setInput(inputStream, null)
var eventType = parser.eventType
var foundItem = false
while (eventType != XmlPullParser.END_DOCUMENT) {
val tagname = parser.name
when (eventType) {
XmlPullParser.START_TAG -> if (tagname.equals("item", ignoreCase = true)) {
foundItem = true
rssItem = RssItem()
}
XmlPullParser.TEXT -> text = parser.text
XmlPullParser.END_TAG -> if (tagname.equals("item", ignoreCase = true)) {
rssItem?.let { rssItems.add(it) }
foundItem = false
} else if (foundItem && tagname.equals("title", ignoreCase = true)) {
rssItem!!.title = text.toString()
} else if (foundItem && tagname.contains("guid", ignoreCase = true)) {
rssItem!!.link = text.toString()
} else if (foundItem && tagname.equals("description", ignoreCase = true)) {
rssItem!!.description = text.toString()
} else if (foundItem && tagname.contains("creator", ignoreCase = true)) {
rssItem!!.creator = text.toString()
} else if (foundItem && tagname.equals("pubDate", ignoreCase = true)) {
rssItem!!.pubDate = text.toString()
}else if (foundItem && tagname.contains("content", ignoreCase = true)) {
rssItem!!.image = parser.getAttributeValue(0)
}
}
eventType = parser.next()
在最后一个 else if
中,我试图获得 url 值,但是 parser.getAttributeValue(0)
得到 IndexOutOfBoundsException
如果我这样做 text.toString()
在另一个 else if
中,不粉碎,但 returns null
当然是因为两个标签之间没有任何东西
关于如何从标签本身读取信息的任何线索???
非常感谢
尝试读取 START_TAG 子句中的属性,如下所示。
while (eventType != XmlPullParser.END_DOCUMENT) {
val tagname = parser.name
when (eventType) {
XmlPullParser.START_TAG -> if (tagname.equals("item", ignoreCase = true)) {
foundItem = true
rssItem = RssItem()
} else if (foundItem && tagname.contains("content", ignoreCase = true)) {
//rssItem!!.image = parser.getAttributeValue(0)
rssItem!!.image = parser.getAttributeValue("", "url")
}
:
}
:
}
我有以下 rss:https://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml 我可以毫无问题地阅读所有信息,但只有一个标签:
<media:content height="151" medium="image" url="https://someurl.jpg" width="151"/>
我需要此标签中的 url,但我不知道如何从标签中获取信息。其余信息在两个标签之间,所以没有问题,但这个信息在标签本身上。
我的解析函数是这样的
fun parse(inputStream: InputStream): List<RssItem> {
try {
val factory = XmlPullParserFactory.newInstance()
factory.isNamespaceAware = true
val parser = factory.newPullParser()
parser.setInput(inputStream, null)
var eventType = parser.eventType
var foundItem = false
while (eventType != XmlPullParser.END_DOCUMENT) {
val tagname = parser.name
when (eventType) {
XmlPullParser.START_TAG -> if (tagname.equals("item", ignoreCase = true)) {
foundItem = true
rssItem = RssItem()
}
XmlPullParser.TEXT -> text = parser.text
XmlPullParser.END_TAG -> if (tagname.equals("item", ignoreCase = true)) {
rssItem?.let { rssItems.add(it) }
foundItem = false
} else if (foundItem && tagname.equals("title", ignoreCase = true)) {
rssItem!!.title = text.toString()
} else if (foundItem && tagname.contains("guid", ignoreCase = true)) {
rssItem!!.link = text.toString()
} else if (foundItem && tagname.equals("description", ignoreCase = true)) {
rssItem!!.description = text.toString()
} else if (foundItem && tagname.contains("creator", ignoreCase = true)) {
rssItem!!.creator = text.toString()
} else if (foundItem && tagname.equals("pubDate", ignoreCase = true)) {
rssItem!!.pubDate = text.toString()
}else if (foundItem && tagname.contains("content", ignoreCase = true)) {
rssItem!!.image = parser.getAttributeValue(0)
}
}
eventType = parser.next()
在最后一个 else if
中,我试图获得 url 值,但是 parser.getAttributeValue(0)
得到 IndexOutOfBoundsException
如果我这样做 text.toString()
在另一个 else if
中,不粉碎,但 returns null
当然是因为两个标签之间没有任何东西
关于如何从标签本身读取信息的任何线索???
非常感谢
尝试读取 START_TAG 子句中的属性,如下所示。
while (eventType != XmlPullParser.END_DOCUMENT) {
val tagname = parser.name
when (eventType) {
XmlPullParser.START_TAG -> if (tagname.equals("item", ignoreCase = true)) {
foundItem = true
rssItem = RssItem()
} else if (foundItem && tagname.contains("content", ignoreCase = true)) {
//rssItem!!.image = parser.getAttributeValue(0)
rssItem!!.image = parser.getAttributeValue("", "url")
}
:
}
:
}