class XMLSeq(val reader: XMLStreamReader) : Sequence { override fun iterator() = object : Iterator { override fun hasNext() = reader.hasNext() ​ override fun next(): RawProduct { var item: RawProduct? = null while (item == null) { if (reader.next() == XMLStreamReader.START_ELEMENT && reader.name.toString() == "item") item = xmlMapper.streamValue>(reader).filter { it.value is String } as RawProduct } return item } ​ private inline fun XmlMapper.streamValue(reader: XMLStreamReader): T = this.readValue(reader, jacksonTypeRef()) ​ private val xmlMapper = XmlMapper( JacksonXmlModule().apply { setDefaultUseWrapper(false) }).registerKotlinModule() .configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true) .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) as XmlMapper } ​ companion object { fun from(stream: InputStream): XMLSeq { val reader = XMLInputFactory.newFactory().createXMLStreamReader(stream) return XMLSeq(reader) } }