Last active
January 27, 2024 09:48
-
-
Save Audhil/cf9844def5ad9e4210985d2080a101f0 to your computer and use it in GitHub Desktop.
XML generation with Kotlin extension functions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// XML generation by code | |
// based on https://www.schibsted.pl/blog/back-end/readable-xml-kotlin-extensions/ | |
fun XmlSerializer.document(docName: String = "UTF-8", | |
xmlStringWriter: StringWriter = StringWriter(), | |
init: XmlSerializer.() -> Unit): String { | |
startDocument(docName, true) | |
xmlStringWriter.buffer.setLength(0) // refreshing string writer due to reuse | |
setOutput(xmlStringWriter) | |
init() | |
endDocument() | |
return xmlStringWriter.toString() | |
} | |
// element | |
fun XmlSerializer.element(name: String, init: XmlSerializer.() -> Unit) { | |
startTag("", name) | |
init() | |
endTag("", name) | |
} | |
// element with attribute & content | |
fun XmlSerializer.element(name: String, | |
content: String, | |
init: XmlSerializer.() -> Unit) { | |
startTag("", name) | |
init() | |
text(content) | |
endTag("", name) | |
} | |
// element with content | |
fun XmlSerializer.element(name: String, content: String) = | |
element(name) { | |
text(content) | |
} | |
fun XmlSerializer.attribute(name: String, value: String) = | |
attribute("", name, value) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class DashBoardActivity : AppCompatActivity() { | |
@Inject | |
lateinit var xmlSerializer: XmlSerializer // val xmlSerializer = Xml.newSerializer() | |
override fun onCreate(savedInstanceState: Bundle?) { | |
super.onCreate(savedInstanceState) | |
makingXML() | |
} | |
private fun makingXML() { | |
val USD: Currency = Currency.getInstance("USD") | |
val EUR: Currency = Currency.getInstance("EUR") | |
val persons = listOf( | |
Person(Name("John", "Doe"), | |
listOf( | |
Account("JP Morgan Chase & Co", "000-111-222-333", USD), | |
Account("Goldman Sachs", "000-999999999-222-444", EUR) | |
) | |
), | |
Person(Name("Jane", "Doe"), | |
listOf( | |
Account("JP Morgan Chase & Co", "000-777-222-333", USD), | |
Account("Goldman Sachs", "000-888888888-222-444", EUR))) | |
) | |
val thisIsXML = xmlSerializer.document { | |
element("persons") { | |
attribute("version", "1.1") | |
attribute("created", Calendar.getInstance().time.toString()) | |
persons.forEach { (name, accounts) -> | |
element("person") { | |
element("name") { | |
element("first", name.first) | |
element("last", name.last) | |
} | |
element("accounts") { | |
accounts.forEach { (bank, number, currency) -> | |
element("account") { | |
element("bank", bank) | |
element("number", number) | |
element("currency", currency.currencyCode) | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
println(thisIsXML) // refer output1 | |
thisIsXML = xmlSerializer.document { | |
element("Movies") { | |
element("row") { | |
attribute("no", "1") | |
element("FL", "6000000066015") { | |
attribute("val", "TicketId") | |
} | |
element("FL", "Dunkirk") { | |
attribute("val", "MovieName") | |
} | |
element("FL") { | |
attribute("val", "TimeLog") | |
element("row") { | |
attribute("no", "1") | |
element("FL", "23/01/2018") { | |
attribute("val", "logDate") | |
} | |
element("FL", "08:00") { | |
attribute("val", "startTime") | |
} | |
} | |
} | |
} | |
} | |
} | |
println(thisIsXML) // refer output2 | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
data class Name( | |
val first: String, | |
val last: String | |
) | |
data class Account( | |
val bank: String, | |
val number: String, | |
val currency: Currency | |
) | |
data class Person( | |
val name: Name, | |
val accounts: List<Account> | |
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<persons version="1.1" created="Mon Jan 22 19:15:38 GMT+05:30 2018"> | |
<person> | |
<name> | |
<first>John</first> | |
<last>Doe</last> | |
</name> | |
<accounts> | |
<account> | |
<bank>JP Morgan Chase & Co</bank> | |
<number>000-111-222-333</number> | |
<currency>USD</currency> | |
</account> | |
<account> | |
<bank>Goldman Sachs</bank> | |
<number>000-999999999-222-444</number> | |
<currency>EUR</currency> | |
</account> | |
</accounts> | |
</person> | |
<person> | |
<name> | |
<first>Jane</first> | |
<last>Doe</last> | |
</name> | |
<accounts> | |
<account> | |
<bank>JP Morgan Chase & Co</bank> | |
<number>000-777-222-333</number> | |
<currency>USD</currency> | |
</account> | |
<account> | |
<bank>Goldman Sachs</bank> | |
<number>000-888888888-222-444</number> | |
<currency>EUR</currency> | |
</account> | |
</accounts> | |
</person> | |
</persons> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<Movies> | |
<row no="1"> | |
<FL val="TicketId">6000000066015</FL> | |
<FL val="MovieName">Dunkirk</FL> | |
<FL val="TimeLog"> | |
<row no="1"> | |
<FL val="date">23/01/2018</FL> | |
<FL val="startTime">08:00</FL> | |
</row> | |
</FL> | |
</row> | |
</Movies> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
How to printout XmlSerializer to view in console log?