Sobes.tech
Middle

Jak se pracuje s XML v Kotlinu?

sobes.tech AI

Odpověď od AI

Práce s XML v Kotlinu může být realizována několika způsoby, v závislosti na úkolu a preferencích:

  1. Standardní Java API: Kotlin je plně kompatibilní s Javou, proto lze použít standardní Java XML API:

    • javax.xml.parsers.DocumentBuilderFactory a org.w3c.dom.Document pro DOM-parsing (pohodlné pro navigaci ve struktuře).
    • javax.xml.stream.XMLInputFactory a javax.xml.stream.events.XMLEvent nebo javax.xml.stream.XMLStreamReader pro StAX-parsing (událostní, efektivnější pro velké soubory).
    • javax.xml.transform.TransformerFactory pro transformaci XML (XSLT).
    • javax.xml.bind.JAXBContext pro JAXB (vázání XML na Java objekty, i když v moderním Kotlinu jsou preferovány kotlinx.serialization nebo Moshi s pluginem pro XML).
  2. Koručiny a Flow (pro asynchronní zpracování): Při práci s HTTP požadavky vracejícími XML lze použít koručiny pro provádění parsování na pozadí a Flow pro zpracování posloupnosti prvků nebo událostí XML.

  3. Třetí strany knihovny: Existuje mnoho knihoven třetích stran, které poskytují pohodlnější nebo specializovanější způsoby práce s XML v Kotlinu:

    • Kotlinx.serialization-xml: Experimentální plugin pro kotlinx.serialization, umožňující serializaci/deserializaci Kotlin objektů do XML.
    • Moshi: Ačkoliv primárně pro JSON, existují rozšíření nebo adaptéry pro práci s XML.
    • Simple XML Serialization: Populární Java knihovna, kterou lze použít v Kotlinu.
    • Jackson XML: Část knihovny Jackson, s podporou serializace/deserializace Java/Kotlin objektů do XML.

Příklad DOM-parsing:

import javax.xml.parsers.DocumentBuilderFactory
import org.w3c.dom.Document
import java.io.File

fun parseXmlFile(filePath: String): Document {
    val factory = DocumentBuilderFactory.newInstance()
    val builder = factory.newDocumentBuilder()
    val inputFile = File(filePath)
    return builder.parse(inputFile)
}

fun main() {
    val doc = parseXmlFile("example.xml")
    // Další práce s DOM stromem
    // println("Root element :" + doc.documentElement.nodeName)
}

Příklad StAX-parsingu (Pull parser):

import javax.xml.stream.XMLInputFactory
import java.io.FileInputStream

fun processXmlStream(filePath: String) {
    val inputFactory = XMLInputFactory.newInstance()
    val xmlReader = inputFactory.createXMLStreamReader(FileInputStream(filePath))

    while (xmlReader.hasNext()) {
        when (xmlReader.next()) {
            javax.xml.stream.XMLStreamConstants.START_ELEMENT -> {
                // Zpracování počátečního tagu
            }
            javax.xml.stream.XMLStreamConstants.CHARACTERS -> {
                // Zpracování textového obsahu
            }
            // Další události (END_ELEMENT, COMMENT atd.)
        }
    }
    xmlReader.close()
}

fun main() {
    // processXmlStream("example.xml")
}

Volba metody závisí na velikosti XML souboru, potřebě navigace v jeho struktuře, výkonu a stylu programování (imperativní vs. deklarativní, použití knihoven). Pro jednoduché případy postačí standardní Java API, pro složitější struktury nebo binding k objektům mohou být vhodnější kotlinx.serialization-xml nebo Jackson XML.