对于 Java 对 xml 文件的读写,我在网上看了很多版本,结构差不多,根据自己的理解进行了一些总结。
写入数据到 xml 相对比较简单,我总结了以下两种写入方法,仅供参考!
先看代码
import java.io.PrintWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class XmlCreateAndRead {
public static void main(String[] args) {
//从数据库读出数据写入xml文件
boolean flag = addCompany();
//从xml文件读出展示到页面
// Map company = findByUnitcode("736350492");
System.out.println(flag);
}
/**
* 插入对象到xml中
* @param form
*/
public static boolean addCompany() {
/*
* 1. (创建)得到Document
* 2. (创建)得到root元素
* 3. 要把数据对象转换成Element元素
* 4. 把对象的属性插入到root元素中
* 5. 回写document
*/
//获取要写入xml文件的数据,可以从数据库获取,这里直接用一个Map对象作为例子
Map comMap = new HashMap();
comMap.put("UNIT_ID", "89adf979asd");
comMap.put("UNIT_CODE", "xiaoCreate");
comMap.put("UNIT_NAME", "上市公司");
comMap.put("DISPLAYNAME", "北京海淀");
try {
// 1. 创建Docuembnt
Document doc = DocumentHelper.createDocument();
// 2. 创建根元素
Element root = doc.addElement("city");
root.addComment("文档的根city已经创建。");// 添加注释
/* //以下三行为追加数据到 xml 文件时 使用
SAXReader reader = new SAXReader(); // 创建解析器
Document doc = reader.read("E://temptest//xmlTest.xml"); // 得到Document
Element root = doc.getRootElement(); //得到根元素
*/
/*
* 3. 完成添加元素,并返回添加的元素!
* 向root中添加一个名为company的元素!并返回这个元素
*/
Element comElement = root.addElement("company");
// 设置comElement的属性!
comElement.addAttribute("unitId", (String) comMap.get("UNIT_ID"));
comElement.addAttribute("unitCode", (String) comMap.get("UNIT_CODE"));
comElement.addAttribute("unitName", (String) comMap.get("UNIT_NAME"));
comElement.addAttribute("cityArea", (String) comMap.get("DISPLAYNAME"));
// 添加comElement的子元素节点!
comElement.addElement("unitId").addText((String) comMap.get("UNIT_ID"));
comElement.addElement("unitCode").addText((String) comMap.get("UNIT_CODE"));
comElement.addElement("unitName").addText((String) comMap.get("UNIT_NAME"));
comElement.addElement("cityArea").addText((String) comMap.get("DISPLAYNAME"));
// 创建输出流
Writer out = new PrintWriter("E:\\temptest\\xmlTest.xml", "utf-8");
// 格式化
OutputFormat format = new OutputFormat("\t", true);
format.setTrimText(true);//去掉原来的空白(\t和换行和空格)!
XMLWriter writer = new XMLWriter(out, format);
// 把document对象写到out流中。
writer.write(doc);
out.close();
writer.close();
return true;
} catch(Exception e) {
// 把编译异常转换成运行异常!
throw new RuntimeException(e);
}
}
}
注意:新建的 xml 文档有一种编码格式,notpad++在菜单栏的 格式 设置,editplus 可以在菜单栏的 工具-配置用户工具-文件 中设置(https://jingyan.baidu.com/article/e5c39bf58c008c39d76033f6.html);写入的内容有一种编码格式,在 Java 代码中设置
这个例子里,主要有以下功能:
+ 可以直接创建新的 xml 文件,也可以追加数据到已有的 xml 文件,注意第一二步的语句即可。
+ 可以给元素节点增加属性,当然也可以增加子元素节点
+ 注意设置编码格式
+ 如果数据不是一个对象,而是一个对象列表,那么循环增加即可
我看到有的文章说 SAX 只支持解析 xml 文档,但是下面这个例子,我觉得是 SAX 写入的。也许是以前不支持,现在支持了吧。
同样先看例子:
import java.io.*;
import java.util.*;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.SAXException;
// SAX写入XML文件
// 参考:http://blog.csdn.net/hairongtian/article/details/7525292
public class SAXWriteTest {
// 句柄
private TransformerHandler handler = null;
// 输出流
private OutputStream outStream = null;
// 根节点
private String rootElement;
public SAXWriteTest(String fileName, String rootElement) throws Exception {
this.rootElement = rootElement;
// 创建句柄,并设置初始参数
SAXTransformerFactory fac = (SAXTransformerFactory) SAXTransformerFactory
.newInstance();
handler = fac.newTransformerHandler();
Transformer transformer = handler.getTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
outStream = new FileOutputStream(fileName);
handler.setResult(new StreamResult(outStream));
System.out.println("初始化成功");
}
public void start() throws Exception {
handler.startDocument();
handler.characters("\n".toCharArray(), 0, "\n".length());//给子元素节点添加缩进
handler.startElement("", "", rootElement, null);
System.out.println("文档开始...");
}
// 这个函数是最重要的,它可以控制各个细节:是否写入属性值,文本值又是多少等等
public void write(HashMap map, String element)
throws SAXException {
handler.characters("\n ".toCharArray(), 0, "\n ".length());//给子元素节点添加缩进
handler.startElement("", "", element, null);
Iterator it = map.keySet().iterator();
while (it.hasNext()) {
String key = (String) it.next();
String value = map.get(key);
handler.characters("\n ".toCharArray(), 0, "\n ".length());//给子元素节点添加缩进
handler.startElement("", "", key, null);
handler.characters(value.toCharArray(), 0, value.length());
handler.endElement("", "", key);
}
handler.characters("\n ".toCharArray(), 0, "\n ".length());//给子元素节点添加缩进
handler.endElement("", "", element);
System.out.println("写入元素成功!");
}
public void end() throws Exception {
handler.endElement("", "", rootElement);
handler.endDocument();
outStream.close();
System.out.println("文档结束!");
}
public static void main(String[] args) throws Exception {
SAXWriteTest xml = new SAXWriteTest("E:\\temptest\\student.xml", "students");
xml.start();
HashMap map = new HashMap();
map.put("id", "20050505");
map.put("name", "zhaobenshan");
map.put("age", "21");
map.put("classes", "Act051");
xml.write(map, "student");
map = new HashMap();
map.put("id", "20050506");
map.put("name", "songdandan");
map.put("age", "20");
map.put("classes", "Act052");
xml.write(map, "student");
xml.end();
}
}
执行成功后,打开文件如下图:
这个例子也是前辈的,我主要是给子元素节点添加了缩进,相当于格式化了一下
+ 例子中也是一个对象一个对象写入的,如果需要写入对象列表,则循环即可
+ 这个例子是新建一个 xml 文档,追加的功能待研究