本文共 6327 字,大约阅读时间需要 21 分钟。
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 ArrayListparseXML() { 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 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(); }}
newbook.xml
java编程思想 Bruce Eckel 2015 79 深入理解java虚拟机 周志明 40
转载地址:http://cjeii.baihongyu.com/