四种方式生成xml文件:
DOM、SAX (Java提供)
JDOM、DOM4J (第三方提供)

DOM:

  1. 创建一个 DocumentBuilderFactory 对象,静态方法newInstance()
  2. 创建一个 DocumentBuilder 对象,DocumentBuilderFactory实例的newDocumentBuilder()方法
  3. 通过DocumentBuilder对象调用newDocument方法,返回一个 Document 对象
  4. 通过Document对象调用creatElement方法,创建一个节点元素,返回 Element 对象
    通过Element对象的 appendChild 方法向该元素添加子元素
    通过Element对象的 setAttribute 方法,给元素添加属性
    ……
  5. 通过 TransformerFactory 的静态方法newInstance(),创建TransformerFactory对象
  6. 通过TransformerFactory的newTransformer(),创建 Transformer 对象
  7. Transformer对象的setOutputProperty(OutputKeys.INDENT,”yes”)方法可以用来换行(可选)
  8. 调用Transformer的 transform ()方法将创建的XML转换成Result,Result可通过new File()构建输出文件
/**
     * DOM方式创建xml文件
     * @param file 文件
     * @throws Exception
     */
    public static void main(String [] args) {
		DOMcreate(new File("dom.xml"));
	}
    public static void DOMcreate(File file)throws Exception{
        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
        DocumentBuilder db=dbf.newDocumentBuilder();
        Document document=db.newDocument();
        document.setXmlStandalone(true);
        Element root=document.createElement("tb_student");
        for (int i = 0; i < 3; i++) {
            Element student=document.createElement("student");
            Element name=document.createElement("name"),
                    age=document.createElement("age"),
                    grade=document.createElement("grade");
                student.setAttribute("id", i+"");
                name.setTextContent("张"+i);
                age.setTextContent(""+i*5);
                grade.setTextContent(""+i*20);
                student.appendChild(name);
                student.appendChild(age);
                student.appendChild(grade);
            root.appendChild(student);
        }
        document.appendChild(root);     
        TransformerFactory tff=TransformerFactory.newInstance();
        Transformer tf=tff.newTransformer();
        tf.setOutputProperty(OutputKeys.INDENT, "yes");
        tf.transform(new DOMSource(document), new StreamResult(file));
    }



SAX:

  1. 用ArrayList存储xml所需的对象集合
  2. 通过SAXTransformerFactory的静态方法newInstance()创建一个 SAXTransformerFactory 对象
  3. 通过SAXTransformerFactory对象的newTransformerHandler()创建一个 TransformerHandler 对象
  4. 通过TransformerHandler对象的getTransformer()创建一个 Transformer 对象
  5. Transformer对象的setOutputProperty(OutputKeys.INDENT,”yes”)可以实现换行(可选)
  6. Transformer对象的setOutputProperty(OutputKeys.ENCODING,”编码名称”)可以实现编码格式(可选)
  7. 创建 Result 对象,并使用TransformerHandler对象的 setResult (Result)方法使其与TransformerHandler关联
  8. 使用TransformerHandler对象的进行xml文件内容的编写(遍历ArrayList创建各个节点)
    startDocument();//开始文档
    endDocument();//结束文档
    startElement(String uri,String localName,String qName,Attributes atts);//元素标签开始
    endElement(String uri,String localName,String qName,Attributes atts);//元素标签结束
/**
     * SAX方式创建xml文件
     * @param file
     * @throws Exception
     */
    public static void SAXcreate(File file)throws Exception {
        //初始化要生成文件的数据
        ArrayList<Student> students=new ArrayList<Student>();
        for (int i = 0; i < 3; i++) {
            Student student=new Student(i,"张"+i,5*i,10*i);
            students.add(student);
        }

        SAXTransformerFactory stf=(SAXTransformerFactory) SAXTransformerFactory.newInstance();
        TransformerHandler handler=stf.newTransformerHandler();
        Transformer tf=handler.getTransformer();
        tf.setOutputProperty(OutputKeys.INDENT, "yes");//标签自动换行
        tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");//编码格式
        StreamResult result=new StreamResult(file);//创建Result对象
        handler.setResult(result);//关联

        handler.startDocument();
        handler.startElement("", "", "tb_students", null);//根节点标签

        for (Student student : students) {
            AttributesImpl atts=new AttributesImpl();//创建熟悉
            atts.addAttribute("", "", "id", "", student.getId()+"");
            handler.startElement("", "", "student", atts);//元素标签开始

            handler.startElement("", "", "name", null);//元素标签开始
            handler.characters(student.getName().toCharArray(), 0, student.getName().length());//元素标签内容
            handler.endElement("", "", "name");//元素标签结束

            handler.startElement("", "", "age", null);
            handler.characters((""+student.getAge()).toCharArray(), 0, (""+student.getAge()).length());
            handler.endElement("", "", "age");

            handler.startElement("", "", "grade", null);
            handler.characters((""+student.getGrade()).toCharArray(), 0,(""+student.getGrade()).toCharArray().length);
            handler.endElement("", "", "grade");

            handler.endElement("", "", "student");//元素标签结束
        }

        handler.endElement("", "", "tb_students");//结束根节点标签
        handler.endDocument();
    }



实体类student

package entity;

public class Student {

    private int id;
    private String name;
    private int age;
    private int grade;

    public Student() {
        // TODO Auto-generated constructor stub
    }
    public Student(int id, String name, int age, int grade) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getGrade() {
        return grade;
    }
    public void setGrade(int grade) {
        this.grade = grade;
    }

}



DOM4J:

  1. 通过 DocumentHelper 的静态方法 createDocument 创建一个 Document 对象
  2. 创建节点:Document对象的 addElement 方法 返回Element对象
  3. 节点添加属性:Element对象的 addAttribute 方法
    节点添加内容:Element对象的 setText add 方法
  4. 创建 XMLWriter 对象 (new) (可使用输出流、OutputFormat作为参数,分别给出输出地址和格式)
    XMLWriter对象的setEscapeText方法可以设置字符是否转义,默认true(转义)
  5. 调用XMLWriter对象的 write 方法,Document对象作为参数
  6. 关闭XMLWriter对象,以及相关资源的 close 操作
/**
     * DOM4J方式创建xml文件
     * @param file
     * @throws Exception
     */
    public static void DOM4Jcreate(File file)throws Exception{
        org.dom4j.Document document=DocumentHelper.createDocument();
        org.dom4j.Element root=document.addElement("rss");
        root.addAttribute("version", "2.0");
        org.dom4j.Element channel=root.addElement("channel");
        org.dom4j.Element title=channel.addElement("title");
        title.setText("新闻国内");
        //...
        XMLWriter writer=new XMLWriter(new FileOutputStream(file),OutputFormat.createPrettyPrint());
        writer.setEscapeText(false);//字符是否转义,默认true
        writer.write(document);
        writer.close();
    }

注:此处模拟的是一个”rss”文件的生成部分代码, RSS(Really Simple Syndication) 是一种描述和同步网站内容的格式,是使用最广泛的XML应用。



JDOM:

  1. 创建 Document 对象 (new)
  2. 创建 Element 对象 (new) 并向其中添加属性/内容/子节点
  3. 向Document对象中添加Element节点 addContent / setContent
    (或者创建Document对象时将Element对象作为参数等)
  4. 创建 XMLOutputter 对象 (new) 并调用 output 方法生成xml文档
/**
     * JDOM方式创建xml文件
     * @param file
     * @throws Exception
     */
    public static void JDOMcreate(File file)throws Exception{
        org.jdom2.Document document=new org.jdom2.Document();
        org.jdom2.Element root=new org.jdom2.Element("rss");
        root.setAttribute("version", "2.0");
        root.addContent(
                new org.jdom2.Element("channel").addContent(
                        new org.jdom2.Element("title").setText("新闻国内")));
        document.setRootElement(root);
        XMLOutputter outputter=new XMLOutputter();
        outputter.setFormat(Format.getPrettyFormat());//设置文本格式
        outputter.output(document, new FileOutputStream(file));
    }