1. 程式人生 > >Java——SAX方式生成XML

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;
    }

}

通過測試可見生成成功。