Java 操作 xml 檔案之寫入
阿新 • • 發佈:2019-01-11
對於 Java 對 xml 檔案的讀寫,我在網上看了很多版本,結構差不多,根據自己的理解進行了一些總結。
寫入資料到 xml 相對比較簡單,我總結了以下兩種寫入方法,僅供參考!
1、dom4j 寫入
先看程式碼
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<String, Object> 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<String,Object> comMap = new HashMap<String,Object>();
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 檔案,也可以追加資料到已有的 xml 檔案,注意第一二步的語句即可。
+ 可以給元素節點增加屬性,當然也可以增加子元素節點
+ 注意設定編碼格式
+ 如果資料不是一個物件,而是一個物件列表,那麼迴圈增加即可
2、SAX 寫入
我看到有的文章說 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<String, String> map, String element)
throws SAXException {
handler.characters("\n ".toCharArray(), 0, "\n ".length());//給子元素節點新增縮排
handler.startElement("", "", element, null);
Iterator<String> 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<String, String> map = new HashMap<String, String>();
map.put("id", "20050505");
map.put("name", "zhaobenshan");
map.put("age", "21");
map.put("classes", "Act051");
xml.write(map, "student");
map = new HashMap<String, String>();
map.put("id", "20050506");
map.put("name", "songdandan");
map.put("age", "20");
map.put("classes", "Act052");
xml.write(map, "student");
xml.end();
}
}
執行成功後,開啟檔案如下圖:
這個例子也是前輩的,我主要是給子元素節點添加了縮排,相當於格式化了一下
+ 例子中也是一個物件一個物件寫入的,如果需要寫入物件列表,則迴圈即可
+ 這個例子是新建一個 xml 文件,追加的功能待研究