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

XML-parserin DSL:lle merkittävästi järkevämpi syntaksi

parent e0860cdc
No related branches found
No related tags found
No related merge requests found
......@@ -70,31 +70,37 @@ class XMLParser {
var rmgroup: RMGroup? = null
parseXML(path) {
startElement {
element("character") {character = Character()}
element("literal") {character!!.literal = value()!!}
element("reading_meaning") {rmgroup = RMGroup()}
element("reading") {
rmgroup!!.reading.add(Pair(
attribute("r_type"),
value()!!
))
element("character") {
start { character = Character() }
end {
parsed.add(character!!)
character = null
}
}
element("literal") {
start { character!!.literal = value()!! }
}
element("reading_meaning") {
start { rmgroup = RMGroup() }
end {
character!!.rmgroups.add(rmgroup!!)
rmgroup = null
}
element("meaning") {
}
element("meaning") {
start {
rmgroup!!.meaning.add(Pair(
attribute("m_lang"),
value()!!
))
}
}
endElement {
element("character") {
parsed.add(character!!)
character = null
}
element("reading_meaning") {
character!!.rmgroups.add(rmgroup!!)
rmgroup = null
element("reading") {
start {
rmgroup!!.reading.add(Pair(
attribute("r_type"),
value()!!
))
}
}
}
......
package guru.kake.ronove
import java.io.FileInputStream
import java.lang.ClassCastException
import javax.xml.namespace.QName
import javax.xml.stream.XMLEventReader
import javax.xml.stream.XMLInputFactory
......@@ -20,22 +19,20 @@ class XMLParserDSL(path: String) {
}
}
fun startElement(f: OuterElement.() -> Unit) {
if (event?.isStartElement == true) OuterElement(reader, event!!).f()
}
fun element(name: String, f: Element.() -> Unit) = Element(name, reader, event!!).f()
fun endElement(f: OuterElement.() -> Unit) {
if (event?.isEndElement == true) OuterElement(reader, event!!).f()
}
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()
}
class OuterElement(private val reader: XMLEventReader, private val event: XMLEvent) {
fun element(element: String, f: InnerElement.() -> Unit) {
if ((event?.isStartElement == true && event!!.asStartElement().name.localPart.toString() == element) ||
(event?.isEndElement == true && event!!.asEndElement().name.localPart.toString() == element))
InnerElement(reader, event!!).f()
fun end(f: () -> Unit) {
if (event.isEndElement && event.asEndElement().name.localPart.toString() == name)
f()
}
class InnerElement(private val reader: XMLEventReader, private val event: XMLEvent) {
class StartElement(private val reader: XMLEventReader, private val event: javax.xml.stream.events.StartElement) {
fun value(): String? {
return try {
reader.peek().asCharacters().data
......@@ -44,18 +41,9 @@ class XMLParserDSL(path: String) {
}
}
fun attribute(attr: String): String? {
return try {
event.asStartElement().getAttributeByName(QName(attr))!!.value
} catch (e: Exception) {
null
}
}
fun attribute(attr: String): String? = event.getAttributeByName(QName(attr))?.value
}
}
}
fun parseXML(path: String, loop: XMLParserDSL.() -> Unit) = XMLParserDSL(path).parse(loop)
fun parseXML(path: String, loop: XMLParserDSL.() -> Unit) = XMLParserDSL(path).parse(loop)
\ No newline at end of file
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