Java——SAX方式生成XML

使用SAX方式生成XML文件有如下步驟:

  1. 創建SAXTransformerFactory對象
  2. 通過SAXTransformerFactory對象創建TransformerHandler對象
  3. 通過TransformerHandler對象獲得Transformer對象
  4. 設置Transformer對象的輸出屬性(setOutputProperty()
  5. 創建Result對象,並將目的XML文件與其關聯
  6. 通過TransformerHandler對象的setResult()方法將Result與TransformerHandler關聯起來
  7. 通過TransformerHandler的startDocument()方法開啓文檔(一併使用endDocument()方法關閉文檔,以防忘記)
  8. 通過TransformerHandler的startElement()方法新建節點(一併使用endElement()方法關閉節點;使用characters()方法設置節點值)

以上就是使用SAX方式生成XML文件的基本步驟。


下面來看代碼:

創建SAXTransformerFactory對象(需要進行強轉,因爲返回的是TransformerFactory的對象):

// 創建SAXTransformerFactory對象
SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();

創建TransformerHandler的對象:

// 通過SAXTransformerFactory對象創建TransformerHandler對象
TransformerHandler handler = factory.newTransformerHandler();

創建Transformer對象:

// 通過Handler創建Transformer對象
Transformer transformer = handler.getTransformer();

設置Transformer對象的輸出屬性(設置編碼爲UTF-8,設置換行):

// 設置Transformer的屬性     transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");

創建Result對象,並將目的XML文件與其關聯:

// 創建Result對象,並將目的XML文件與其關聯
Result result = new StreamResult(dest);

將Result對象與TransformerHandler關聯起來:

// 將handler與result關聯起來
handler.setResult(result);

開啓文檔:

// 開啓文檔
handler.startDocument();

新建節點:
startElement()方法的第一個參數爲URI,第二個爲localName,第三個爲節點名稱qName,第四個爲屬性Attributes

// 新建節點
handler.startElement("", "", "bookstore", null);

創建一個屬性對象:

AttributesImpl atts = new AttributesImpl();

添加屬性:

atts.addAttribute("", "", 屬性名, 屬性類型, 屬性值);

設置節點值:

handler.characters(字符數組, 開始的位置, 長度);

關閉節點和文檔:

// 關閉節點
handler.endElement("", "", "bookstore");
// 關閉文檔
handler.endDocument();

以上是各對象常用的方法,下面給出完整的代碼:

本例中,我們使用SAX從books.xml文件中解析出所有的Book,並將這些Book放入列表中;再使用SAX方式,根據列表中的Book,生成一個books2.xml文件。

package util;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

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.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;

import domain.Book;

public class XMLUtil {

    private List<Book> bookList;

    //生成XML文件
    public void createXMLBySAX(List<Book> books, File dest) {
        // 創建SAXTransformerFactory對象
        SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
        try {
            // 通過SAXTransformerFactory對象創建TransformerHandler對象
            TransformerHandler handler = factory.newTransformerHandler();
            // 通過Handler創建Transformer對象
            Transformer transformer = handler.getTransformer();
            // 設置Transformer的屬性
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            // 創建Result對象,並將目的XML文件與其關聯
            Result result = new StreamResult(dest);
            // 將handler與result關聯起來
            handler.setResult(result);

            try {
                // 開啓文檔
                handler.startDocument();
                // 新建節點
                handler.startElement("", "", "bookstore", null);
                AttributesImpl atts = new AttributesImpl();
                for (Book book : books) {
                    atts.clear();
                    atts.addAttribute("", "", "id", "", String.valueOf(book.getId()));
                    handler.startElement("", "", "book", atts);
                    handler.startElement("", "", "name", null);
                    handler.characters(book.getName().toCharArray(), 0, book.getName().length());
                    handler.endElement("", "", "name");
                    handler.startElement("", "", "author", null);
                    handler.characters(book.getAuthor().toCharArray(), 0, book.getAuthor().length());
                    handler.endElement("", "", "author");
                    handler.startElement("", "", "price", null);
                    handler.characters(Float.toString(book.getPrice()).toCharArray(), 0,
                            Float.toString(book.getPrice()).length());
                    handler.endElement("", "", "price");
                    handler.endElement("", "", "book");
                }
                // 關閉節點
                handler.endElement("", "", "bookstore");
                // 關閉文檔
                handler.endDocument();
            } catch (SAXException e) {
                e.printStackTrace();
            }

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

    //解析XML文件
    public List<Book> parseXMLBySAX(File file) {
        SAXParser parser = getParser();
        MyHandler handler = new MyHandler();
        try {
            parser.parse(file, handler);
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        bookList = handler.getBookList();

        return bookList;
    }

    public SAXParser getParser() {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = null;
        try {
            parser = factory.newSAXParser();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }
        return parser;
    }

    public List<Book> getBookList() {
        return bookList;
    }

    public void setBookList(List<Book> bookList) {
        this.bookList = bookList;
    }

}

通過測試可見生成成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章