使用SAX方式生成XML文件有如下步驟:
- 創建SAXTransformerFactory對象
- 通過SAXTransformerFactory對象創建TransformerHandler對象
- 通過TransformerHandler對象獲得Transformer對象
- 設置Transformer對象的輸出屬性(
setOutputProperty()
) - 創建Result對象,並將目的XML文件與其關聯
- 通過TransformerHandler對象的
setResult()
方法將Result與TransformerHandler關聯起來 - 通過TransformerHandler的
startDocument()
方法開啓文檔(一併使用endDocument()
方法關閉文檔,以防忘記) - 通過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;
}
}
通過測試可見生成成功。