Я думаю, что мне не хватает чего-то фундаментального в том, как анализировать XML с Kotlin. Я не могу понять это правильно, и это должно быть простое упражнение.
Пример данных Sitemap:
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="//www.vikingpest.com/main-sitemap.xsl"?>
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://www.site.fake/blog/</loc>
</url>
<url>
<loc>https://www.site.fake/news/acquires-services/</loc>
<lastmod>2018-12-22T19:40:45+00:00</lastmod>
</url>
</urlset>
Я пытался создать простой класс данных для преобразования xml в:
data class SitemapData(
@XmlElement(namespace = "http://www.sitemaps.org/schemas/sitemap/0.9") val uri : String,
@XmlElement(name = "url") val url : String,
@XmlElement(name = "loc") val loc : String
)
Я получаю ошибку пространства имен:
javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.sitemaps.org/schemas/sitemap/0.9", local:"urlset"). Expected elements are (none)
Простая реализация парсера:
class Sitemap(resource: String) {
private val sitemap = URL(resource).openConnection() as HttpURLConnection
private val data : InputStream
init {
data = sitemap.inputStream
}
fun process() {
val unmarshaller : Unmarshaller = JAXBContext.newInstance(SitemapData::class.java).createUnmarshaller()
val xml = unmarshaller.unmarshal(data)
print(xml.toString())
}
}
Не получается установить аннотацию пакета для @XMLSchema, и я не могу найти документацию о том, как установить аннотацию для пакета. Любая идея о том, как использовать JAXB для чтения, анализа и извлечения значений из XML Sitemap?
Есть идеи?