天天看點

kotlin/java生成xml

四種方式
  1. DOM方式
  2. SAX方式
  3. JDOM方式
  4. DOM4J方式

Maven依賴

<!--解析xml-->
            <!-- https://mvnrepository.com/artifact/org.jdom/jdom -->
            <dependency>
                <groupId>org.jdom</groupId>
                <artifactId>jdom</artifactId>
                <version>2.0.2</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
            <dependency>
                <groupId>dom4j</groupId>
                <artifactId>dom4j</artifactId>
                <version>1.6.1</version>
            </dependency>
           

1.DOM方式

package imooc.write.toxml

import org.junit.Test
import java.io.File
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.transform.OutputKeys
import javax.xml.transform.TransformerFactory
import javax.xml.transform.dom.DOMSource
import javax.xml.transform.stream.StreamResult

/**
 * @author futao
 * Created on 2017/11/6 - 15:23.
 * 使用DOM方式生成xml檔案
 */
class DOM {
    @Test
    fun xml() {
        val documentBuilderFactory = DocumentBuilderFactory.newInstance()
        val documentBuilder = documentBuilderFactory.newDocumentBuilder()
        //傳回一個Document對象
        val document = documentBuilder.newDocument()
        //取消xml檔案頭的standalone資訊
        document.xmlStandalone = true
        //建立了一個根節點
        val element = document.createElement("books")
        val book = document.createElement("book")
        book.setAttribute("id", "1")
        book.setAttribute("id2", "2")
        //建立name子節點
        val name = document.createElement("name")
//        name.nodeValue="Java實作生成xml檔案"
        name.textContent = "Java實作生成xml檔案"
        //添加到book子節點下
        book.appendChild(name)
        //向根節點添加子節點
        element.appendChild(book)
        //向DOM樹中添加節點
        document.appendChild(element)

        val transformerFactory = TransformerFactory.newInstance()

        val transformer = transformerFactory.newTransformer()
        //是否自動換行
        transformer.setOutputProperty(OutputKeys.INDENT, "yes")
        transformer.transform(DOMSource(document), StreamResult(File("domBooks.xml")))


//        val outputFormat = OutputFormat.createPrettyPrint()
//        val xmlWriter = XMLWriter(FileOutputStream(File("domBooks.xml")))
//        xmlWriter.write(document)
//        xmlWriter.close()


    }
}
           

2. SAX方式

package imooc.write.toxml

import org.junit.Test
import org.xml.sax.helpers.AttributesImpl
import java.io.File
import java.io.FileOutputStream
import javax.xml.transform.OutputKeys
import javax.xml.transform.sax.SAXTransformerFactory
import javax.xml.transform.stream.StreamResult

/**
 * @author futao
 * Created on 2017/11/6 - 15:44.
 * 使用SAX方式生成xml檔案
 */
class SAX {
    @Test
    fun xml() {
//        val saxParserFactory = SAXParserFactory.newInstance()
//        val saxParser = saxParserFactory.newSAXParser()
        val transformerFactory = SAXTransformerFactory.newInstance() as SAXTransformerFactory
        val transformerHandler = transformerFactory.newTransformerHandler()
        val transformer = transformerHandler.transformer
        //編碼格式
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8")
        //是否換行
        transformer.setOutputProperty(OutputKeys.INDENT, "yes")
        val result = StreamResult(FileOutputStream(File("saxBooks.xml")))
        transformerHandler.setResult(result)
        //打開文檔
        transformerHandler.startDocument()

        val attributesImpl = AttributesImpl()
        //books根節點開始
        transformerHandler.startElement("", "", "books", attributesImpl)

        attributesImpl.addAttribute("", "", "id", "", "1")
        //給子節點的屬性指派
        //book子節點開始
        transformerHandler.startElement("", "", "book", attributesImpl)
        //清除之前的屬性值
        attributesImpl.clear()
        //book節點的子節點name節點開始
        transformerHandler.startElement("", "", "name", attributesImpl)
        //向name節點中添加值
        transformerHandler.characters("從入門到精通".toCharArray(), 0, "從入門到精通".toCharArray().size)
        //book節點的子節點name節點結束
        transformerHandler.endElement("", "", "name")
        //book子節點結束
        transformerHandler.endElement("", "", "book")
        //books根節點結束
        transformerHandler.endElement("", "", "books")


        //關閉文檔
        transformerHandler.endDocument()


    }
}
           

3. JDOM方式

package imooc.write.toxml

import org.jdom2.CDATA
import org.jdom2.Document
import org.jdom2.Element
import org.jdom2.output.Format
import org.jdom2.output.XMLOutputter
import org.junit.Test
import java.io.File
import java.io.FileOutputStream

/**
 * @author futao
 * Created on 2017/11/6 - 18:59.
 * JDOM方式生成xml
 */
class JDOM {
    @Test
    fun xml() {
        //生成rss根節點
        val rss = Element("rss")
        //給rss節點添加屬性值
        rss.setAttribute("id", "1")
        //生成channel節點
        val channel = Element("channel")
        //給rss節點添加channel子節點
        rss.addContent(channel)
        //生成title節點
        val title = Element("title")
        //設定title的内容
        title.text = "                 我是                 title                   "
        //把title節點添加到channel的子節點
        channel.addContent(title)


        val link1 = Element("link1")
        channel.addContent(link1)
        val content = CDATA("link")
        content.text = ">>><<<<www.baidu.com"
        link1.addContent(content)


        val link2 = Element("link2")
        link2.text = ">>><<<www.baidu.com"
        channel.addContent(link2)


        //生成一個Document對象
        val document = Document(rss)
        //格式化xml,換行和縮進
        val prettyFormat = Format.getPrettyFormat()
//        prettyFormat.escapeStrategy = EscapeStrategy(function = { false })

        //取消trim
        prettyFormat.textMode = Format.TextMode.TRIM_FULL_WHITE
        //建立XMLOutputter對象
        val xmlOutputter = XMLOutputter(prettyFormat)
        //通過XMLOutputter将Document轉換成xml文檔
        xmlOutputter.output(document, FileOutputStream(File("jdomBooks.xml")))
    }
}
           

4. DOM4J方式

package imooc.write.toxml


import org.dom4j.DocumentHelper
import org.dom4j.io.OutputFormat
import org.dom4j.io.XMLWriter
import org.junit.Test
import java.io.File
import java.io.FileOutputStream

/**
 * @author futao
 * Created on 2017/11/6 - 17:10.
 * DOM4J方法生成xml
 * 個人覺得比較友善
 */
class DOM4J {
    @Test
    fun xml() {
        //建立xml對象
        val document = DocumentHelper.createDocument()
        //添加rss節點
        val rss = document.addElement("rss")
        //rss節點的version屬性
        rss.addAttribute("version", "2.0")
        //生成子節點和子節點資訊
        val channel = rss.addElement("channel")
        val title = channel.addElement("title")
        title.addText("國内新聞")
        val link = channel.addElement("link")
        link.addText(">><<http://www.baidu.com")
        val link2 = channel.addElement("link2")
//        link2.addCDATA(">><<http://www.baidu.com")
        //設定生成xml的格式,換行,縮進
        val prettyPrint = OutputFormat.createPrettyPrint()
        prettyPrint.encoding = "UTF-8"
        //生成xml檔案
        val xmlWriter = XMLWriter(FileOutputStream(File("dom4jBooks.xml")), prettyPrint)
        //不轉義
        xmlWriter.isEscapeText = false
        xmlWriter.write(document)
        xmlWriter.close()

    }
}