本文介绍使用w3c标准生成的xml文档,可以使用工具类中提供的方法任意组装数据你要生成的数据。关于里面的jar包。作者使用的是jdk1.8,在rt.jar中,所以,此处不需要添加jar包。根据自己的使用情况而定。关于解析xml可以查看同类文章使用w3c解析xml文档废话不多说,以下是工具类。
注:以下工具类是考虑到各种异常,封装好的工具类,如果使用的过程中有疑惑可以将整个工具类拷贝,然后根据示例去生成你的xml,如果单纯的拷贝其中的某个方法,则可能会出现问题,因为工具类之间互有关联性。建议直接拷贝使用。
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
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.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;
import org.w3c.dom.Node;
public class CreateXmlFile {
/**
* 将指定的Node写到指定的OutputStream流中。
*
* @param encoding
* 编码。
* @param os
* OutputStream流。
* @param node
* Node节点。
* @throws TransformerException
* 如果转换过程中发生不可恢复的错误时,抛出此异常。
*/
private static void writeXml(OutputStream os, Node node, String encoding)
throws TransformerException {
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
transformer.setOutputProperty("indent", "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, encoding);
DOMSource source = new DOMSource();
source.setNode(node);
StreamResult result = new StreamResult();
result.setOutputStream(os);
transformer.transform(source, result);
}
/**
* 创建文档之前,现将document创建出来,并且将document的根节点创建出来
*
* @return document对象
* @throws ParserConfigurationException
*/
public static Document createDocument() throws ParserConfigurationException {
// 定义工厂 API,使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 定义 API, 使其从 XML 文档获取 DOM 文档实例。使用此类,应用程序员可以从 XML 获取一个 Document
DocumentBuilder builder = factory.newDocumentBuilder();
// Document 接口表示整个 HTML 或 XML 文档。从概念上讲,它是文档树的根,并提供对文档数据的基本访问
return builder.newDocument();
}
/**
* 向document添加根节点
*
* @param document
* @param rootName
* 根节点的名称
* @return 根节点对应的element对象
*/
public static Element rootElement(Document document, String rootName) {
Element element = document.createElement(rootName);
document.appendChild(element);
return element;
}
/**
* 创建一个element
*
* @param document
* @param elementName
* 名称
* @return 返回element对象
*/
public static Element docCreateElement(Document document, String elementName) {
return document.createElement(elementName);
}
/**
* 向父级element添加子element
*
* @param document
* @param parentElement
* 父级element对象
* @param childName
* 子级element对象的<b>名称</b>
* @return 子级element对象
*/
public static void parentAddChild(Document document, Element parentElement,
Element childName) {
parentElement.appendChild(childName);
}
/**
* 向最底层的element添加元素属性
*
* @param document
* @param element
* 操作的对象
* @param attrName
* 属性名称
* @param attrValue属性对应的值
*/
public static void addAttrtoElement(Document document, Element element,
String attrName, String attrValue) {
Element name = document.createElement(attrName);
name.appendChild(document.createTextNode(attrValue));
element.appendChild(name);
}
/**
* 将Document输出到指定的文件中。
*
* @param fileName
* 文件名。
* @param node
* 要保存的对象。
* @param encoding
* 保存的编码。
* @throws FileNotFoundException
* 指定的文件名不存在时,抛出此异常。
* @throws TransformerException
* 如果转换过程中发生不可恢复的错误时,抛出此异常。
*/
public static void saveXml(final String fileName, final Node node,
String encoding) throws FileNotFoundException, TransformerException {
writeXml(new FileOutputStream(fileName), node, encoding);
}
}
public static void main(String[] args) {
try {
Document doc = CreateXmlFile.createDocument();
// 此处创建是向document中添加根目录
Element root = CreateXmlFile.rootElement(doc, "persons1");
// 创建一个的element节点名称为person2
Element ele = CreateXmlFile.docCreateElement(doc, "person2");
// 向根目录中添加子节点(此方法可以重复使用,不断向你需要添加的父节点添加子节点)
XmlUtils.parentAddChild(doc, root, ele);
for (int i = 0; i < 3; i++) {
Element ele1 = CreateXmlFile.docCreateElement(doc, "person3");
CreateXmlFile.addAttrtoElement(doc, ele1, "age", "23-" + i);
CreateXmlFile.addAttrtoElement(doc, ele1, "name", "张三-" + i);
// 将组装好的属性对象添加到他的上级节点中
CreateXmlFile.parentAddChild(doc, ele, ele1);
}
// 保存到指定的文件夹中
CreateXmlFile.saveXml("D:/dir/files/1502767036836/aaaaa.xml", root,
"utf-8");
} catch (Exception e) {
e.printStackTrace();
}
}
<?xml version="1.0" encoding="utf-8"?>
<persons1>
<person2>
<person3>
<age>23-0</age>
<name>张三-0</name>
</person3>
<person3>
<age>23-1</age>
<name>张三-1</name>
</person3>
<person3>
<age>23-2</age>
<name>张三-2</name>
</person3>
</person2>
</persons1>