四種方式
- DOM方式
- SAX方式
- JDOM方式
- 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()
}
}