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 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);
        }
    }
}

执行成功后,打开文件如下图:
Java 操作 xml 文件之写入_第1张图片

注意:新建的 xml 文档有一种编码格式,notpad++在菜单栏的 格式 设置,editplus 可以在菜单栏的 工具-配置用户工具-文件 中设置(https://jingyan.baidu.com/article/e5c39bf58c008c39d76033f6.html);写入的内容有一种编码格式,在 Java 代码中设置

这个例子里,主要有以下功能:
+ 可以直接创建新的 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 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();
    }
}

执行成功后,打开文件如下图:
Java 操作 xml 文件之写入_第2张图片
这个例子也是前辈的,我主要是给子元素节点添加了缩进,相当于格式化了一下
+ 例子中也是一个对象一个对象写入的,如果需要写入对象列表,则循环即可
+ 这个例子是新建一个 xml 文档,追加的功能待研究

你可能感兴趣的:(Java,xml)