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()

    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容