Java生成XML四種方式

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

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

實體類studentdom

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對象的setTextadd方法
  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));
    }
相關文章
相關標籤/搜索