一 概述
同XML文件的读取一样,生成或写入XML文件也有四种方式,分别为DOM,SAX,DOM4J和JDOM,其中前两种为官方,后两种第三方API,需要相应jar包,其它详见Java操作XML文件(读)这篇文章,这里不是累述。
二 DOM方式生成
DOM方式的生成是基于树(tree)结构,首先生成树(root)节点,生成的DOM树会驻留在内存中,这样优点是方便随时增删改,所以如果XML需要频繁的修改,推荐这种方式。具体代码如下:
package com.jamie.writer;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class DomWriter {
public static void main(String[] args) {
// 创建一个DocumentBuilderFactory对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 创建DocumentBuilder对象
try {
DocumentBuilder db = dbf.newDocumentBuilder();
// 获得一个Document对象,写入xml结构
Document document = db.newDocument();
// 去掉standalone属性
document.setXmlStandalone(true);
// 创建一个根节点
Element classElement = document.createElement("class");
// 生产根节点下的子节点,并添加属性
Element personElement = document.createElement("person");
personElement.setAttribute("id", "1");
// 添加name 标签,并赋值
Element nameElement = document.createElement("name");
nameElement.setTextContent("小明");
personElement.appendChild(nameElement);
// 将子节点person添加到根节点class
classElement.appendChild(personElement);
// 将根节点添加到document,生产一个dom树
document.appendChild(classElement);
// 创建xml文件,需要一个TransformerFactory对象
TransformerFactory tff = TransformerFactory.newInstance();
try {
// 创建一个Transformer对象
Transformer tf = tff.newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.transform(new DOMSource(document), new StreamResult(
new File("clsss.xml")));
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
}
}
三 SAX方式生成
SAX方式生成XML是基于事件模型的,当把某一标签走完后,不能走回头路,因为它没有状态性可言,即无法返回修改某一完成的标签,但是SAX的效率很高。具体代码如下:
package com.jamie.writer;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
public class SaxWrite {
public static void main(String[] args) {
// 创建一个SAXTransformerFactory
SAXTransformerFactory stff = (SAXTransformerFactory) SAXTransformerFactory
.newInstance();
try {
// 获取TransformerHandler对象
TransformerHandler handler = stff.newTransformerHandler();
// 通过handler创建Transformers对象
Transformer former = handler.getTransformer();
// 通过Transformer对象对生成的xml文件进行设置
former.setOutputProperty(OutputKeys.INDENT, "yes");
former.setOutputProperty(OutputKeys.ENCODING, "utf-8");
// 创建一个result对象,用于进行文件的创建和文件输出流的编写,并使其与handler对象关联
File f = new File("sax.xml");
if (!f.exists()) {
f.createNewFile();
}
Result rs = new StreamResult(new FileOutputStream(f));
handler.setResult(rs);
// 利用handler对象进行xml内容的编写
// 打开doument
handler.startDocument();
// 创建Attribute对象,用户重复利用
AttributesImpl attrs = new AttributesImpl();
handler.startElement("", "", "class", attrs);
attrs.clear();
attrs.addAttribute("", "", "id", "", "1");
// 创建person标签
handler.startElement("", "", "person", attrs);
attrs.clear();
// 创建name标签
handler.startElement("", "", "name", attrs);
String name = "小明";
handler.characters(name.toCharArray(), 0, name.length());
handler.endElement("", "", "name");
handler.endElement("", "", "person");
handler.endElement("", "", "class");
// 关闭document
handler.endDocument();
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
四 DOM4J方式生成
DOM4J是基于底层API(也就是官方的提供的方式,DOM和SAX)的一种生成方式,效率一般来说仅次于SAX,并且在功能和使用的便捷方面都很强大,所以也是现实开发中比较常用的一种方式。具体代码如下,别忘了引入相应的jar:
package com.jamie.writer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class Dom4jWriter {
public static void main(String[] args) {
// 调用生成方法
Dom4jWriter dom4j = new Dom4jWriter();
dom4j.createXml();
}
/**
* 生成方法
*/
public void createXml() {
// 使用DocumentHelper创建Document对象,即整个xml文档
Document document = DocumentHelper.createDocument();
// 创建根节点class 及相应的节点,注意addElement方法的依属关系
Element classEle = document.addElement("class");
Element personEle = classEle.addElement("person");
Element nameEle = personEle.addElement("name");
personEle.addAttribute("id", "1");
nameEle.setText("小明");
// 设置生成xml内容的格式,换行
OutputFormat of = OutputFormat.createPrettyPrint();
System.out.println(document.asXML());
// 设置编码
of.setEncoding("UTF-8");
File fileWriter;
try {
// 创建文件
fileWriter = new File("dom4j.xml");
// dom4j提供的专门的文件写入对象XMLWriter
XMLWriter xmlWriter = new XMLWriter(
new FileOutputStream(fileWriter), of);
xmlWriter.write(document);
xmlWriter.flush();
xmlWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
五 JDOM方式生成
与DOM4J类似JDOM也是一种第三方的基于底层API方式的一种操作XML文件的工具,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。与其它方式相比,它使用起来更便捷,但是效率较低,建议在小文档情况下使用。代码如下:
package com.jamie.writer;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
public class JdomWriter {
public static void main(String[] args) {
JdomWriter jd = new JdomWriter();
jd.createXml();
}
public void createXml() {
// 创建根节点
Element root = new Element("class");
// 生成一个document对象
Document document = new Document(root);
// 创建person节点
Element person = new Element("person");
person.setAttribute("id", "1");
root.addContent(person);
// 创建nam节点
Element name = new Element("name");
name.setText("小明");
person.addContent(name);
// 对xml进行排版格式化,两种方式
Format format = Format.getPrettyFormat();
/*
* Format format =Format.getCompactFormat(); format.setIndent("");
*/
// 创建XMLOutputter对象
XMLOutputter out = new XMLOutputter(format);
// 使用XMLOutputter对象将Document对象转成xml文档
try {
out.output(document, new FileOutputStream(new File("jdom.xml")));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
六 总结
以上代码生成的xml文件内容都应该如下:
<?xml version="1.0" encoding="UTF-8"?>
<class>
<person id="1">
<name>小明</name>
</person>
</class>
例子都比较简单,但是常用的涉及到了,几种方法中最常用的还是属于DOM4J的方式,现在很多框架中也使用这种方式。
以上代码都是自己一个个敲的,一是让自己加深学习印象,二是如果可以也给需要的人做一个参考。因为自己还在初级学习阶段,如果有问题,希望有心人指出,相互交流学习,谢谢!