SAX生成XML文件的基本流程
1.创建SAXTransformerFactor对象
2.通过SAXTransformerFactor对象创建TransformerHandler对象
3.通过TransformerHandler对象创建Transformer对象
4.创建Result对象,与目的文件关联,并将此对象与TransformerHandler对象关联
5.创建AttributesImpl对象(此对象为节点的属性)
6.使用TransformerHandler对象的startDocument()开始文档,文档编写结束后调用endDocument()方法结束文档
7.使用TransformerHandler对象的startElement()开始元素,此方法有四个参数(名称空间URI,本地名称localName,限定名qName,连接到元素的属性Atrributes);元素结束后调用endElement()方法结束对应元素,此方法有三个参数(名称空间URI,本地名称localName,限定名qName)
8.使用TransformerHandler对象的characters()方法为每个元素设置文本数据
示例
本示例是基于解析book.xml文件所得结果进行生成
package wds.test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
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.SAXException;
import org.xml.sax.helpers.AttributesImpl;
import wds.entity.Book;
import wds.handler.SAXParserHandler;
public class SAXCreateXML {
/**
* @param args
*/
public ArrayList<Book> parseXML() {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParserHandler handler = null;
try {
SAXParser parser = factory.newSAXParser();
handler = new SAXParserHandler();
parser.parse("book.xml", handler);
System.out.println("···········共有" + handler.getList().size()
+ "本书···········");
for (Book book : handler.getList()) {
System.out.println(book.toString());
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return handler.getList();
}
public void createXML() {
// 解析所得Book的list集合
ArrayList<Book> bookList = parseXML();
// 1.创建一个SAXTransformerFactor类对象
SAXTransformerFactory tff = (SAXTransformerFactory) SAXTransformerFactory
.newInstance();
try {
// 2.通过TransformerFactory对象创建TransformerHandler对象
// newTransformerHandler()此方法获取能够将SAX
// ContentHandler事件处理为Result的TransformerHandler对象
TransformerHandler handler = tff.newTransformerHandler();
// 3. 创建Transformer对象 Transformer为抽象类 此类的实例能够将源树转换为结果树
Transformer tf = handler.getTransformer();
// 4 .通过transformer对象对xml文件进行 配置
// 设置编码
tf.setOutputProperty(OutputKeys.ENCODING, "utf-8");
// 设置是否换行
tf.setOutputProperty(OutputKeys.INDENT, "yes");
// 设置目的文件
File f = new File("src/res/newbook.xml");
// 若文件不存在,新创建一个
if (!f.exists()) {
f.createNewFile();
}
// 5. 创建Result对象将目的文件与之关联
Result result = new StreamResult(new FileOutputStream(f));
// 将Result对象与handler关联
handler.setResult(result);
// 6.利用handler对象对xml内容进行编写
// 打开document
handler.startDocument();
// 属性对象
AttributesImpl attr = new AttributesImpl();
handler.startElement("", "", "bookstore", attr);
for (Book book : bookList) {
// 每次使用属性对象,将其清空
attr.clear();
// 为book属性赋值
attr.addAttribute("", "", "id", "", book.getId());
handler.startElement("", "", "book", attr);
if (book.getName() != null && !book.getName().trim().equals("")) {
attr.clear();
handler.startElement("", "", "name", attr);
handler.characters(book.getName().toCharArray(), 0, book
.getName().length());
handler.endElement("", "", "name");
}
if (book.getAuthor() != null
&& !book.getAuthor().trim().equals("")) {
handler.startElement("", "", "author", attr);
handler.characters(book.getAuthor().toCharArray(), 0, book
.getAuthor().length());
handler.endElement("", "", "author");
}
if (book.getYear() != null && !book.getYear().trim().equals("")) {
handler.startElement("", "", "year", attr);
handler.characters(book.getYear().toCharArray(), 0, book
.getYear().length());
handler.endElement("", "", "year");
}
if (book.getPrice() != null
&& !book.getPrice().trim().equals("")) {
handler.startElement("", "", "price", attr);
handler.characters(book.getPrice().toCharArray(), 0, book
.getPrice().length());
handler.endElement("", "", "price");
}
handler.endElement("", "", "book");
}
handler.endElement("", "", "bookstore");
// 关闭document
handler.endDocument();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new SAXCreateXML().createXML();
}
}
生成的XML文件
newbook.xml
<?xml version="1.0" encoding="utf-8"?><bookstore>
<book id="1">
<name>java编程思想</name>
<author>Bruce Eckel</author>
<year>2015</year>
<price>79</price>
</book>
<book id="2">
<name>深入理解java虚拟机</name>
<author>周志明</author>
<price>40</price>
</book>
</bookstore>