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<Book> bookList;

    //生成XML文件
    public void createXMLBySAX(List<Book> 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<Book> 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<Book> getBookList() {
        return bookList;
    }

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

}

通过测试可见生成成功。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用SAXJava生成XML的步骤如下: 1. 创建一个 SAXParserFactory 实例并且用它来创建一个 SAXParser 对象。 2. 创建一个 DefaultHandler 的子类实例。 3. 调用 SAXParser 的 parse() 方法,并将 XML 文件名和 DefaultHandler 子类实例作为参数传入。 下面是一个使用 SAXJava 创建 XML 文件的示例代码: ```java import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; import java.io.*; public class CreateXMLWithSAX { public static void main(String[] args) throws Exception { // 创建 SAXParserFactory 和 SAXParser 对象 SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); // 创建 DefaultHandler 的子类实例 MyHandler handler = new MyHandler(); // 调用 parse() 方法解析 XML 文件 saxParser.parse(new File("students.xml"), handler); } } class MyHandler extends DefaultHandler { // 重写 startDocument() 方法 public void startDocument() throws SAXException { System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); System.out.println("<students>"); } // 重写 startElement() 方法 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.print("<" + qName); for (int i = 0; i < attributes.getLength(); i++) { System.out.print(" " + attributes.getQName(i) + "=\"" + attributes.getValue(i) + "\""); } System.out.print(">"); } // 重写 characters() 方法 public void characters(char[] ch, int start, int length) throws SAXException { System.out.print(new String(ch, start, length)); } // 重写 endElement() 方法 public void endElement(String uri, String localName, String qName) throws SAXException { System.out.print("</" + qName + ">"); } // 重写 endDocument() 方法 public void endDocument() throws SAXException { System.out.println("</students>"); } } ``` 这个示例程序会读取名为 "students.xml" 的 XML 文件,并将其转化为以下格式的 XML: ```xml <?xml version="1.0" encoding="UTF-8"?> <students> <student id="1001">Tom</student> <student id="1002">Jerry</student> <student id="1003">Mike</student> </students> ``` 注意:这个示例程序中,MyHandler 类继承了 DefaultHandler 类,并且重写了其中的方法,这些方法会在 SAX 解析过程中被调用。在这些方法中,我们可以根据需要对 XML 文件进行处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值