使用SAX方式生成XML文件有如下步骤:
setOutputProperty()
)setResult()
方法将Result与TransformerHandler关联起来startDocument()
方法开启文档(一并使用endDocument()
方法关闭文档,以防忘记)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 bookList;
//生成XML文件
public void createXMLBySAX(List 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 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 getBookList() {
return bookList;
}
public void setBookList(List bookList) {
this.bookList = bookList;
}
}
通过测试可见生成成功。