博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XML生成(二):SAX生成XML
阅读量:4097 次
发布时间:2019-05-25

本文共 6327 字,大约阅读时间需要 21 分钟。

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
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
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

java编程思想
Bruce Eckel
2015
79
深入理解java虚拟机
周志明
40

转载地址:http://cjeii.baihongyu.com/

你可能感兴趣的文章
浅谈JavaScript--声明提升
查看>>
React非嵌套组件通信
查看>>
Websocket 使用指南
查看>>
浏览器兼容性问题解决方案 · 总结
查看>>
一个很棒的Flutter学习资源列表
查看>>
为什么你应该放弃React老的Context API用新的Context API
查看>>
Koa2初体验
查看>>
Koa 2 初体验(二)
查看>>
Koa2框架原理解析和实现
查看>>
C++模板
查看>>
【C#】如何实现一个迭代器
查看>>
【C#】利用Conditional属性完成编译忽略
查看>>
【Unity】微信登录后将头像存为bytes,将bytes读取成sprite图片
查看>>
【Unity】使用GPS定位经纬度
查看>>
最小费用流 Bellman-Ford与Dijkstra 模板
查看>>
zookeeper(3)---zookeeper API的简单使用(增删改查操作)
查看>>
zookeeper(4)---监听器Watcher
查看>>
mapReduce(3)---入门示例WordCount
查看>>
hbase(3)---shell操作
查看>>
hbase(1)---概述
查看>>