天天看點

記一次思路:如何取消JDOM生成xml時的自動轉義

一般思路:

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

結果:

<link2>&gt;&gt;&gt;&lt;&lt;&lt;www.baidu.com</link2>
           

首先很容易聯想到使用CDATA()

檢視CDATA類的源碼

記一次思路:如何取消JDOM生成xml時的自動轉義

image.png

得知CDATA是Text類的子類

繼續看Text

記一次思路:如何取消JDOM生成xml時的自動轉義

得知Text是Content類的子類。

是以繼承關系是

CDATA extends Text extends Content

再看Element類的源碼

記一次思路:如何取消JDOM生成xml時的自動轉義

得知Elment類也是Content類的子類

看addConten()方法接收的參數是什麼類型

記一次思路:如何取消JDOM生成xml時的自動轉義

得知addContent()接收的是一個Content對象

是以試試用CDATA類代替Element類

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

結果

記一次思路:如何取消JDOM生成xml時的自動轉義

但是少了

<link></link>

包裹,而是作為channel的content存在,是以更改代碼讓其作為

<link></link>

的content就行

最終代碼:

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)
           

最終效果

記一次思路:如何取消JDOM生成xml時的自動轉義

完整代碼

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")))
    }
}