Java——SAX方式生成XML

使用SAX方式生成XML文件有如下步骤:

  1. 创建SAXTransformerFactory对象
  2. 通过SAXTransformerFactory对象创建TransformerHandler对象
  3. 通过TransformerHandler对象获得Transformer对象
  4. 设置Transformer对象的输出属性(setOutputProperty()
  5. 创建Result对象,并将目的XML文件与其关联
  6. 通过TransformerHandler对象的setResult()方法将Result与TransformerHandler关联起来
  7. 通过TransformerHandler的startDocument()方法开启文档(一并使用endDocument()方法关闭文档,以防忘记)
  8. 通过TransformerHandler的startElement()方法新建节点(一并使用endElement()方法关闭节点;使用characters()方法设置节点值)

以上就是使用SAX方式生成XML文件的基本步骤。


下面来看代码:

创建SAXTransformerFactory对象(需要进行强转,因为返回的是TransformerFactory的对象):

// 创建SAXTransformerFactory对象
SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();

创建TransformerHandler的对象:

// 通过SAXTransformerFactory对象创建TransformerHandler对象
TransformerHandler handler = factory.newTransformerHandler();

创建Transformer对象:

// 通过Handler创建Transformer对象
Transformer transformer = handler.getTransformer();

设置Transformer对象的输出属性(设置编码为UTF-8,设置换行):

// 设置Transformer的属性     transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");

创建Result对象,并将目的XML文件与其关联:

// 创建Result对象,并将目的XML文件与其关联
Result result = new StreamResult(dest);

将Result对象与TransformerHandler关联起来:

// 将handler与result关联起来
handler.setResult(result);

开启文档:

// 开启文档
handler.startDocument();

新建节点:
startElement()方法的第一个参数为URI,第二个为localName,第三个为节点名称qName,第四个为属性Attributes

// 新建节点
handler.startElement("", "", "bookstore", null);

创建一个属性对象:

AttributesImpl atts = new AttributesImpl();

添加属性:

atts.addAttribute("", "", 属性名, 属性类型, 属性值);

设置节点值:

handler.characters(字符数组, 开始的位置, 长度);

关闭节点和文档:

// 关闭节点
handler.endElement("", "", "bookstore");
// 关闭文档
handler.endDocument();

以上是各对象常用的方法,下面给出完整的代码:

本例中,我们使用SAX从books.xml文件中解析出所有的Book,并将这些Book放入列表中;再使用SAX方式,根据列表中的Book,生成一个books2.xml文件。

package util;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

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.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;

import domain.Book;

public class XMLUtil {

    private List bookList;

    //生成XML文件
    public void createXMLBySAX(List books, File dest) {
        // 创建SAXTransformerFactory对象
        SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
        try {
            // 通过SAXTransformerFactory对象创建TransformerHandler对象
            TransformerHandler handler = factory.newTransformerHandler();
            // 通过Handler创建Transformer对象
            Transformer transformer = handler.getTransformer();
            // 设置Transformer的属性
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            // 创建Result对象,并将目的XML文件与其关联
            Result result = new StreamResult(dest);
            // 将handler与result关联起来
            handler.setResult(result);

            try {
                // 开启文档
                handler.startDocument();
                // 新建节点
                handler.startElement("", "", "bookstore", null);
                AttributesImpl atts = new AttributesImpl();
                for (Book book : books) {
                    atts.clear();
                    atts.addAttribute("", "", "id", "", String.valueOf(book.getId()));
                    handler.startElement("", "", "book", atts);
                    handler.startElement("", "", "name", null);
                    handler.characters(book.getName().toCharArray(), 0, book.getName().length());
                    handler.endElement("", "", "name");
                    handler.startElement("", "", "author", null);
                    handler.characters(book.getAuthor().toCharArray(), 0, book.getAuthor().length());
                    handler.endElement("", "", "author");
                    handler.startElement("", "", "price", null);
                    handler.characters(Float.toString(book.getPrice()).toCharArray(), 0,
                            Float.toString(book.getPrice()).length());
                    handler.endElement("", "", "price");
                    handler.endElement("", "", "book");
                }
                // 关闭节点
                handler.endElement("", "", "bookstore");
                // 关闭文档
                handler.endDocument();
            } catch (SAXException e) {
                e.printStackTrace();
            }

        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        }
    }

    //解析XML文件
    public List parseXMLBySAX(File file) {
        SAXParser parser = getParser();
        MyHandler handler = new MyHandler();
        try {
            parser.parse(file, handler);
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        bookList = handler.getBookList();

        return bookList;
    }

    public SAXParser getParser() {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = null;
        try {
            parser = factory.newSAXParser();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }
        return parser;
    }

    public List getBookList() {
        return bookList;
    }

    public void setBookList(List bookList) {
        this.bookList = bookList;
    }

}

通过测试可见生成成功。

你可能感兴趣的:(Java,java,xml,sax)