Java中构造、生成XML简明教程
XML作为一种通用的数据交换格式,在Java开发中经常被用来存储配置信息、传输数据等。很多场景下我们需要手动构造和生成XML文件,本文将介绍几种常用的Java生成XML的方式,帮助你快速上手相关操作。
一、使用JDK自带的DOM方式生成XML
DOM(Document Object Model)是JDK原生支持的方式,不需要引入额外依赖,适合生成结构简单的XML文件。它的核心思路是先构建内存中的XML文档树,再将文档写入到文件或输出流中。
下面是使用DOM方式生成XML的完整示例:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
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 DomXmlGenerator {
public static void main(String[] args) {
try {
// 1. 创建DocumentBuilderFactory实例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2. 通过工厂获取DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
// 3. 创建空的Document文档对象
Document document = builder.newDocument();
// 禁用standalone属性
document.setXmlStandalone(true);
// 4. 创建根节点
Element rootElement = document.createElement("students");
document.appendChild(rootElement);
// 5. 创建第一个学生节点
Element student1 = document.createElement("student");
// 给student节点添加id属性
student1.setAttribute("id", "1001");
// 创建name子节点
Element name1 = document.createElement("name");
name1.setTextContent("张三");
// 创建age子节点
Element age1 = document.createElement("age");
age1.setTextContent("20");
// 将子节点添加到student节点
student1.appendChild(name1);
student1.appendChild(age1);
// 将student节点添加到根节点
rootElement.appendChild(student1);
// 6. 创建第二个学生节点
Element student2 = document.createElement("student");
student2.setAttribute("id", "1002");
Element name2 = document.createElement("name");
name2.setTextContent("李四");
Element age2 = document.createElement("age");
age2.setTextContent("21");
student2.appendChild(name2);
student2.appendChild(age2);
rootElement.appendChild(student2);
// 7. 创建TransformerFactory实例,用于将Document转换为XML
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// 设置输出属性,添加换行和缩进
transformer.setOutputProperty("encoding", "UTF-8");
transformer.setOutputProperty("indent", "yes");
// 8. 将Document写入到文件
DOMSource domSource = new DOMSource(document);
StreamResult streamResult = new StreamResult("students.xml");
transformer.transform(domSource, streamResult);
System.out.println("DOM方式生成XML完成,文件路径:students.xml");
} catch (ParserConfigurationException | TransformerException e) {
e.printStackTrace();
}
}
}运行上述代码后,会在项目根目录下生成students.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<students>
<student id="1001">
<name>张三</name>
<age>20</age>
</student>
<student id="1002">
<name>李四</name>
<age>21</age>
</student>
</students>DOM方式的优点是原生支持无需额外依赖,操作简单直观;缺点是如果XML结构非常复杂,构建节点的代码会比较冗长,且大文件场景下内存占用较高。
二、使用JDOM方式生成XML
JDOM是专门为Java设计的XML操作库,相比原生DOM,它的API更符合Java开发者的使用习惯,代码更简洁。使用前需要先引入JDOM的依赖,如果你使用Maven,可以在pom.xml中添加如下依赖:
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom2</artifactId>
<version>2.0.6.1</version>
</dependency>下面是使用JDOM生成XML的示例代码:
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import java.io.FileOutputStream;
import java.io.IOException;
public class JdomXmlGenerator {
public static void main(String[] args) {
try {
// 1. 创建根节点
Element rootElement = new Element("students");
// 2. 创建第一个学生节点
Element student1 = new Element("student");
student1.setAttribute("id", "1001");
student1.addContent(new Element("name").setText("张三"));
student1.addContent(new Element("age").setText("20"));
// 3. 创建第二个学生节点
Element student2 = new Element("student");
student2.setAttribute("id", "1002");
student2.addContent(new Element("name").setText("李四"));
student2.addContent(new Element("age").setText("21"));
// 4. 将学生节点添加到根节点
rootElement.addContent(student1);
rootElement.addContent(student2);
// 5. 创建Document对象,传入根节点
Document document = new Document(rootElement);
// 6. 创建XML输出器,设置输出格式:编码UTF-8,自动缩进换行
XMLOutputter outputter = new XMLOutputter();
outputter.setFormat(Format.getPrettyFormat().setEncoding("UTF-8"));
// 7. 将Document写入文件
outputter.output(document, new FileOutputStream("students_jdom.xml"));
System.out.println("JDOM方式生成XML完成,文件路径:students_jdom.xml");
} catch (IOException e) {
e.printStackTrace();
}
}
}JDOM的代码明显比原生DOM更简洁,链式调用让节点构建更清晰,它屏蔽了很多DOM底层复杂的操作,让开发者更专注于XML结构的设计。不过需要额外引入第三方依赖,适合对代码简洁度有要求的场景。
三、使用DOM4J方式生成XML
DOM4J也是非常流行的XML操作库,性能优异,API丰富,很多开源框架都在使用它处理XML。同样需要先引入依赖,Maven依赖如下:
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.4</version>
</dependency>下面是DOM4J生成XML的示例代码:
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.FileOutputStream;
import java.io.IOException;
public class Dom4jXmlGenerator {
public static void main(String[] args) {
try {
// 1. 创建Document对象
Document document = DocumentHelper.createDocument();
// 2. 创建根节点
Element rootElement = document.addElement("students");
// 3. 创建第一个学生节点
Element student1 = rootElement.addElement("student")
.addAttribute("id", "1001");
student1.addElement("name").setText("张三");
student1.addElement("age").setText("20");
// 4. 创建第二个学生节点
Element student2 = rootElement.addElement("student")
.addAttribute("id", "1002");
student2.addElement("name").setText("李四");
student2.addElement("age").setText("21");
// 5. 设置输出格式:编码UTF-8,自动缩进换行
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
// 6. 创建XMLWriter,写入文件
XMLWriter writer = new XMLWriter(new FileOutputStream("students_dom4j.xml"), format);
writer.write(document);
writer.close();
System.out.println("DOM4J方式生成XML完成,文件路径:students_dom4j.xml");
} catch (IOException e) {
e.printStackTrace();
}
}
}DOM4J的API设计非常灵活,支持XPath查询、大文件流式处理等高级功能,性能表现也很出色,是实际项目中使用非常广泛的选择。如果你的项目需要处理复杂的XML操作,DOM4J会是很好的选择。
四、三种方式对比
为了帮助你根据实际场景选择合适的方式,下面从几个维度对比三种生成XML的方式:
| 方式 | 依赖情况 | 代码简洁度 | 功能丰富度 | 适用场景 |
|---|---|---|---|---|
| JDK DOM | 无需额外依赖 | 较低,代码冗长 | 基础 | 简单XML生成,不想引入第三方依赖的场景 |
| JDOM | 需要引入JDOM库 | 较高,符合Java习惯 | 中等 | 追求代码简洁度,XML操作需求不复杂的场景 |
| DOM4J | 需要引入DOM4J库 | 高,API灵活 | 丰富,支持高级特性 | 复杂XML操作,对性能和功能有要求的场景 |
你可以根据项目的实际需求、是否允许引入第三方依赖等因素,选择最适合自己的XML生成方式。如果是简单的配置类XML生成,原生DOM足够使用;如果是业务系统中频繁操作XML,推荐优先选择DOM4J。