1. 程式人生 > >Java 操作 xml 檔案之寫入

Java 操作 xml 檔案之寫入

對於 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 文件,追加的功能待研究