Skip to content
Snippets Groups Projects
Commit d9947f89 authored by Kaj Koivunen's avatar Kaj Koivunen :coffee:
Browse files

dokumentaatiota ja näkyvyyksien korjailua

parent 502f97ac
No related branches found
No related tags found
No related merge requests found
......@@ -11,11 +11,15 @@ annotation class DSL
/**
* Implements a DSL-language for event-based parsing of XML files.
*
*/
@DSL
class XMLParser private constructor(path: String) {
companion object {
/**
* Parse an XML-file using an event-based interface
* @param path path to file
* @param loop lambda to execute on each XML event
*/
fun parse(path: String, loop: XMLParser.() -> Unit) = XMLParser(path).init(loop)
}
......@@ -23,17 +27,23 @@ class XMLParser private constructor(path: String) {
private val reader: XMLEventReader = factory.createXMLEventReader(FileInputStream(path))
private var event: XMLEvent? = null
fun init(loop: XMLParser.() -> Unit) {
private fun init(loop: XMLParser.() -> Unit) {
while (reader.hasNext()) {
event = reader.nextEvent()
@Suppress("UNUSED_EXPRESSION") // IntelliJ IDEA bug: https://youtrack.jetbrains.com/issue/KT-21282
loop()
}
}
/**
* Specify code to execute based on element name
* @param name Element name
* @param f code to execute on elements matching name
*/
fun element(name: String, f: Element.() -> Unit) = Element(name, reader, event!!).f()
@DSL
class Element(private val name: String, private val reader: XMLEventReader, private val event: XMLEvent) {
inner class Element(private val name: String, private val reader: XMLEventReader, private val event: XMLEvent) {
fun start(f: StartElement.() -> Unit) {
if (event.isStartElement && event.asStartElement().name.localPart.toString() == name)
StartElement(reader, event.asStartElement()).f()
......@@ -45,7 +55,7 @@ class XMLParser private constructor(path: String) {
}
@DSL
class StartElement(private val reader: XMLEventReader, private val event: javax.xml.stream.events.StartElement) {
inner class StartElement(private val reader: XMLEventReader, private val event: javax.xml.stream.events.StartElement) {
fun value(): String? {
return try {
reader.peek().asCharacters().data
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment