XML文件生成方法

1.DOM和SAX(官方)
DOM生成XML文件(基于tree)
1.获取documentBuilder对象
2.获取Document对象
3.创建根节点
4.将子节点添加到DOM树中
5.创建TransformFactory对象
6.创建Transformer对象
7.将document对象(DOM树)转换为xml文件,并控制格式输出
SAX生成XML文件(基于事件)
1.生成一个SAXTransformerFactory类的对象
2.通过SAXTransformerFactory创建一个TransformerHandler的对象
3.通过TransformerHandler对象创建一个Transformer对象
4.通过transformer对象,对XML文件进行设置,如:setProperty,设置编码和换行
5.创建一个result对象,进行文件创建和文件输出流的编写(属性设置之后,document打开之前)
6.使result和TransformerHandler关联
7.利用TransformerHandler对象对XML文件进行编写
8.打开document
9.循环生成book节点和book下的子节点
10.关闭document
2.DOM4J和JDOM(生成全新形式的文件-RSS)
DOM4J生成XML文件(基于底层API)
1.创建document对象,代表整个XML文档
2.创建根节点rss
3.向rss节点中添加version属性
4.向rss节点中添加节点和节点内容
5.设置XML文件格式,和编码字符集
6.内容中处理转义字符(生成的文本不会自动转义)
7.控制台输出XML文件内容
8.生成XML文件
JDOM生成XML文件(基于底层API)
1.生成一个根节点
2.为节点添加属性
3.生成一个document对象
4.向节点中添加内容
5.创建一个XMLOutputter对象
6.利用output将document对象转换为XML文件
区别:
DOM生成的树驻留在内存中(倒树模型-根-》叶)
方便后序改动,修改删除
SAX生成的树不驻留在内存中,一步一步生成
不可以走回头路,SAX性能高,后面不可改动
性能测试:(生成XML时间)
按照生成XML时间排序:
DOM > JDOM > DOM4J > SAX
性能依次提升。

Code-1:DOM创建XML文件
package com.xml;

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 DOMCreateXML {
    /**
     * 创建XML文件
     * @param args
     */
    public DocumentBuilder getDocumentBuilder(){
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = null;
        try {
            db = dbf.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        return db;
    }

    public void createXML(){
        DocumentBuilder db = getDocumentBuilder();
        Document doc= db.newDocument();
        doc.setXmlStandalone(true);
        //创建根节点
        Element bookstore = doc.createElement("bookstore");
        //向bookstore中添加节点
        Element book = doc.createElement("book");
        Element name = doc.createElement("name");
        name.setTextContent("小王子");
        book.setAttribute("id", "001");
        bookstore.appendChild(book);
        book.appendChild(name);
        //将bookstore()添加到document树中
        doc.appendChild(bookstore);
        //创建树之后将树DOM转换为XML文件
        TransformerFactory tff = TransformerFactory.newInstance();
        try {
            Transformer tf = tff.newTransformer();
            //进行合理换行(键值对(属性名和属性值))
            tf.setOutputProperty(OutputKeys.INDENT, "yes");
            tf.transform(new DOMSource(doc), new StreamResult(new File("src/e.xml")));
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }
    }
    /**
     * 主程序
     * @param args
     */
    public static void main(String[] args) {
        DOMCreateXML c = new DOMCreateXML();
        c.createXML();
    }
}


Code-2:SAX创建XML文件
package com.xml;

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

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
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 SAXCreateXML {
    /**
     * SAX方式生成XML文件
     * 
     * @param args
     */
    // 利用一个XML文件解析的结果生成一个XML文件
    public ArrayList<Book> parseXML() {
        // 1首先获取一个SAXFactory的实例factory
        SAXParserFactory factory = SAXParserFactory.newInstance();
        // 2通过factory获取SAXParser的实例
        // 2创建一个SAXParseHandler的实例
        SAXParseHandler phandler = new SAXParseHandler();
        try {
            SAXParser parser = factory.newSAXParser();
            parser.parse("books.xml", phandler);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        ArrayList booklist = phandler.getBooklist();
        return booklist;
    }

    public void createXML() {

        ArrayList<Book> booklist = parseXML();
        // 生成一个XML文件
        // 1.生成一个SAXTransformerFactory类的对象,
        SAXTransformerFactory tff = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
        try {
            // 2.通过SAXTransformerFactory创建一个TransformerHandler的对象
            TransformerHandler tfh = tff.newTransformerHandler();
            // 3.通过TransformerHandler对象创建一个Transformer对象
            Transformer tf = tfh.getTransformer();
            // 4.通过transformer对象,对XML文件进行设置,如:setProperty,设置编码和换行,在setResult之前写
            tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            tf.setOutputProperty(OutputKeys.INDENT, "yes");
            // 5.创建一个result对象,进行文件创建和文件输出流的编写
            File f = new File("src/newbooks.xml");
            if (!f.exists()) {
                f.createNewFile();
            }
            Result result = new StreamResult(new FileOutputStream(f));
            // 6.使result和TransformerHandler关联
            tfh.setResult(result);
            // 7.利用handler对象对XML文件进行编写
            // 8.打开document
            tfh.startDocument();
            // AttributesImpl attr = new AttributesImpl();
            // tfh.startElement("", "", "bookstore", attr);
            // attr.clear();
            // tfh.startElement("", "", "book", attr);
            // attr.addAttribute("", "", "id", "", "001");
            // tfh.endElement("", "", "book");
            // tfh.endElement("", "", "bookstore");
            // 循环生成book节点
            AttributesImpl attr = new AttributesImpl();
            tfh.startElement("", "", "bookstore", attr);
            for (Book book : booklist) {
                attr.clear();
                attr.addAttribute("", "", "id", "", book.getId());
                tfh.startElement("", "", "book", attr);

                //创建name节点
                if(book.getName()!=null && !book.getName().trim().equals("")){
                    attr.clear();
                    tfh.startElement("", "", "name", attr);
                    tfh.characters(book.getName().toCharArray(), 0, book.getName().length());
                    tfh.endElement("", "", "name");
                }
                //创建year节点
                if(book.getYear()!=null && !book.getYear().trim().equals("")){
                    attr.clear();
                    tfh.startElement("", "", "year", attr);
                    tfh.characters(book.getYear().toCharArray(), 0, book.getYear().length());
                    tfh.endElement("", "", "year");
                }
                //创建author节点
                if(book.getAuthor()!=null && !book.getAuthor().trim().equals("")){
                    attr.clear();
                    tfh.startElement("", "", "author", attr);
                    tfh.characters(book.getAuthor().toCharArray(), 0, book.getAuthor().length());
                    tfh.endElement("", "", "author");
                }
                //创建price节点
                if(book.getPrice()!=null && !book.getPrice().trim().equals("")){
                    attr.clear();
                    tfh.startElement("", "", "price", attr);
                    tfh.characters(book.getPrice().toCharArray(), 0, book.getPrice().length());
                    tfh.endElement("", "", "price");
                }
                //创建language节点
                if(book.getLanguage()!=null && !book.getLanguage().trim().equals("")){
                    attr.clear();
                    tfh.startElement("", "", "language", attr);
                    tfh.characters(book.getLanguage().toCharArray(), 0, book.getLanguage().length());
                    tfh.endElement("", "", "language");
                }
                tfh.endElement("", "", "book");
            }
            tfh.endElement("", "", "bookstore");
            // 9.关闭document
            tfh.endDocument();

        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        SAXCreateXML c = new SAXCreateXML();
        c.createXML();
    }

}
Code-3:DOM4J创建XML文件
package com.xml;

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

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class DOM4JRSS {
    /**
     * DOM4J生成RSS文件
     * @param args
     */
    public void createXML(){
        //1.创建document对象,代表整个XML文档
        Document doc = DocumentHelper.createDocument();
        //2.创建根节点rss
        Element rss = doc.addElement("rss");
        //3.向rss节点中添加version属性
        rss.addAttribute("version", "2.0");
        //4.向rss节点中添加节点和节点内容
        Element chanel = rss.addElement("chanel");
        Element title = chanel.addElement("title");
        title.setText("<娱乐消息>");

        //生成XML文件
        //控制台输出XML文件内容
        //设置XML文件格式,和编码字符集
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("GBK");
        XMLWriter writer = null;
        try {
            writer = new XMLWriter(format);
            //5.内容中处理转义字符(生成的文本不会自动转义)
            //默认值为TRUE--转义
            writer.setEscapeText(false);
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {
            writer.write(doc);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //生成XML文件
        File f = new File("rss.xml");
        try {
            XMLWriter writeXMl = new XMLWriter(new FileOutputStream(f), format);
            writeXMl.write(doc);
            writeXMl.close();
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }

    public static void main(String[] args) {
        DOM4JRSS dom = new DOM4JRSS();
        dom.createXML();
    }
}
Code-4:JDOM生成XML文件
package com.xml;

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

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

public class JDOMXML {

    public void createXML(){
        //1.生成一个根节点
        Element rss = new Element("rss");
        //2.为节点添加属性
        rss.setAttribute("version","2.0");
        //3.生成一个document对象
        Document doc = new Document(rss);
        //4.向节点中添加内容
        Element chanel = new Element("chanel");
        rss.addContent(chanel);
        Element title = new Element("title");
        title.setText("<娱乐新闻>");
        chanel.addContent(title);
        //4.创建一个XMLOutputter对象
        Format format = Format.getCompactFormat();
        format.setIndent("");
        format.setEncoding("GBK");
        format.setEscapeStrategy(null);
        XMLOutputter output = new XMLOutputter(format);
        //5.利用output将document对象转换为XML文件
        try {
            output.output(doc, new FileOutputStream(new File("rssnew.xml")));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        JDOMXML c = new JDOMXML();
        c.createXML();
    }
}