一 概述

同XML文件的读取一样,生成或写入XML文件也有四种方式,分别为DOM,SAX,DOM4J和JDOM,其中前两种为官方,后两种第三方API,需要相应jar包,其它详见Java操作XML文件(读)这篇文章,这里不是累述。

二 DOM方式生成

DOM方式的生成是基于树(tree)结构,首先生成树(root)节点,生成的DOM树会驻留在内存中,这样优点是方便随时增删改,所以如果XML需要频繁的修改,推荐这种方式。具体代码如下:

package com.jamie.writer;
    import java.io.File;
    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.TransformerConfigurationException;
    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;

    public class DomWriter {

        public static void main(String[] args) {
            // 创建一个DocumentBuilderFactory对象
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            // 创建DocumentBuilder对象
            try {
                DocumentBuilder db = dbf.newDocumentBuilder();
                // 获得一个Document对象,写入xml结构
                Document document = db.newDocument();
                // 去掉standalone属性
                document.setXmlStandalone(true);
                // 创建一个根节点
                Element classElement = document.createElement("class");
                // 生产根节点下的子节点,并添加属性
                Element personElement = document.createElement("person");
                personElement.setAttribute("id", "1");
                // 添加name 标签,并赋值
                Element nameElement = document.createElement("name");
                nameElement.setTextContent("小明");
                personElement.appendChild(nameElement);
                // 将子节点person添加到根节点class
                classElement.appendChild(personElement);
                // 将根节点添加到document,生产一个dom树
                document.appendChild(classElement);

                // 创建xml文件,需要一个TransformerFactory对象
                TransformerFactory tff = TransformerFactory.newInstance();
                try {
                    // 创建一个Transformer对象
                    Transformer tf = tff.newTransformer();
                    tf.setOutputProperty(OutputKeys.INDENT, "yes");
                    tf.transform(new DOMSource(document), new StreamResult(
                            new File("clsss.xml")));
                } catch (TransformerConfigurationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (TransformerException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            }

        }
    }

三 SAX方式生成

SAX方式生成XML是基于事件模型的,当把某一标签走完后,不能走回头路,因为它没有状态性可言,即无法返回修改某一完成的标签,但是SAX的效率很高。具体代码如下:

package com.jamie.writer;

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;

    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Result;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerConfigurationException;
    import javax.xml.transform.sax.SAXTransformerFactory;
    import javax.xml.transform.sax.TransformerHandler;
    import javax.xml.transform.stream.StreamResult;

    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.AttributesImpl;

    public class SaxWrite {
        public static void main(String[] args) {
            // 创建一个SAXTransformerFactory
            SAXTransformerFactory stff = (SAXTransformerFactory) SAXTransformerFactory
                    .newInstance();
            try {
                // 获取TransformerHandler对象
                TransformerHandler handler = stff.newTransformerHandler();
                // 通过handler创建Transformers对象
                Transformer former = handler.getTransformer();
                // 通过Transformer对象对生成的xml文件进行设置
                former.setOutputProperty(OutputKeys.INDENT, "yes");
                former.setOutputProperty(OutputKeys.ENCODING, "utf-8");
                // 创建一个result对象,用于进行文件的创建和文件输出流的编写,并使其与handler对象关联
                File f = new File("sax.xml");
                if (!f.exists()) {
                    f.createNewFile();
                }
                Result rs = new StreamResult(new FileOutputStream(f));
                handler.setResult(rs);
                // 利用handler对象进行xml内容的编写
                // 打开doument
                handler.startDocument();
                // 创建Attribute对象,用户重复利用
                AttributesImpl attrs = new AttributesImpl();
                handler.startElement("", "", "class", attrs);
                attrs.clear();
                attrs.addAttribute("", "", "id", "", "1");
                // 创建person标签
                handler.startElement("", "", "person", attrs);
                attrs.clear();
                // 创建name标签
                handler.startElement("", "", "name", attrs);
                String name = "小明";
                handler.characters(name.toCharArray(), 0, name.length());
                handler.endElement("", "", "name");
                handler.endElement("", "", "person");
                handler.endElement("", "", "class");
                // 关闭document
                handler.endDocument();
            } catch (TransformerConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

四 DOM4J方式生成

DOM4J是基于底层API(也就是官方的提供的方式,DOM和SAX)的一种生成方式,效率一般来说仅次于SAX,并且在功能和使用的便捷方面都很强大,所以也是现实开发中比较常用的一种方式。具体代码如下,别忘了引入相应的jar:

package com.jamie.writer;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import org.dom4j.*;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.XMLWriter;

    public class Dom4jWriter {

        public static void main(String[] args) {
            // 调用生成方法
            Dom4jWriter dom4j = new Dom4jWriter();
            dom4j.createXml();
        }

        /**
         * 生成方法
         */
        public void createXml() {
            // 使用DocumentHelper创建Document对象,即整个xml文档
            Document document = DocumentHelper.createDocument();
            // 创建根节点class 及相应的节点,注意addElement方法的依属关系
            Element classEle = document.addElement("class");
            Element personEle = classEle.addElement("person");
            Element nameEle = personEle.addElement("name");
            personEle.addAttribute("id", "1");
            nameEle.setText("小明");
            // 设置生成xml内容的格式,换行
            OutputFormat of = OutputFormat.createPrettyPrint();
            System.out.println(document.asXML());
            // 设置编码
            of.setEncoding("UTF-8");
            File fileWriter;
            try {
                // 创建文件
                fileWriter = new File("dom4j.xml");
                // dom4j提供的专门的文件写入对象XMLWriter
                XMLWriter xmlWriter = new XMLWriter(
                        new FileOutputStream(fileWriter), of);
                xmlWriter.write(document);
                xmlWriter.flush();
                xmlWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

五 JDOM方式生成

与DOM4J类似JDOM也是一种第三方的基于底层API方式的一种操作XML文件的工具,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。与其它方式相比,它使用起来更便捷,但是效率较低,建议在小文档情况下使用。代码如下:

package com.jamie.writer;

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;

    import org.jdom2.Document;
    import org.jdom2.Element;
    import org.jdom2.output.Format;
    import org.jdom2.output.XMLOutputter;

    public class JdomWriter {
        public static void main(String[] args) {
            JdomWriter jd = new JdomWriter();
            jd.createXml();
        }

        public void createXml() {
            // 创建根节点
            Element root = new Element("class");
            // 生成一个document对象
            Document document = new Document(root);
            // 创建person节点
            Element person = new Element("person");
            person.setAttribute("id", "1");
            root.addContent(person);
            // 创建nam节点
            Element name = new Element("name");
            name.setText("小明");
            person.addContent(name);
            // 对xml进行排版格式化,两种方式
            Format format = Format.getPrettyFormat();
            /*
             * Format format =Format.getCompactFormat(); format.setIndent("");
             */
            // 创建XMLOutputter对象
            XMLOutputter out = new XMLOutputter(format);
            // 使用XMLOutputter对象将Document对象转成xml文档
            try {
                out.output(document, new FileOutputStream(new File("jdom.xml")));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

六 总结

以上代码生成的xml文件内容都应该如下:

<?xml version="1.0" encoding="UTF-8"?>
        <class>
          <person id="1">
            <name>小明</name>
          </person>
        </class>

例子都比较简单,但是常用的涉及到了,几种方法中最常用的还是属于DOM4J的方式,现在很多框架中也使用这种方式。
以上代码都是自己一个个敲的,一是让自己加深学习印象,二是如果可以也给需要的人做一个参考。因为自己还在初级学习阶段,如果有问题,希望有心人指出,相互交流学习,谢谢!