XML生成(二):SAX生成XML

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值