XML生成(二):SAX生成XML

来源:互联网 发布:阴阳师神龙强化数据 编辑:程序博客网 时间:2024/05/16 17:56

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>
原创粉丝点击