Java——SAX方式生成XML
阿新 • • 發佈:2019-02-16
使用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;
}
}
通過測試可見生成成功。