使用Sax生成xml文件

本文介绍如何使用Sax通过实体类生成对应的xml文件

一、实体类如下

public class Book {
	private String id;
	private String name;
	private String author;
	private String price;
	private String year;
	private String edition;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public String getPrice() {
		return price;
	}

	public void setPrice(String price) {
		this.price = price;
	}

	public String getYear() {
		return year;
	}

	public void setYear(String year) {
		this.year = year;
	}

	public String getEdition() {
		return edition;
	}

	public void setEdition(String edition) {
		this.edition = edition;
	}

	@Override
	public String toString() {
		return "Book [id=" + id + ", name=" + name + ", author=" + author + ", price=" + price + ", year=" + year
				+ ", edition=" + edition + "]";
	}

}

二、数据如下,为三本书的集合

Book [id=156, name=计算机网络, author=谢希仁, price=39, year=2013, edition=null]  
Book [id=234, name=计算机操作系统, author=佚名, price=40, year=2013, edition=第四版]  
Book [id=367, name=计算机组成原理, author=null, price=35, year=2013, edition=第三版]  

三、此处,我们通过自己编写的一个方法将三本书封装到bookList中,读者不用了解细节,此处只是提供数据源

List<Book> bookList = SaxXmlParser.parseXml();

四、Sax的准备工作

List<Book> bookList = SaxXmlParser.parseXml();
// 1、创建SAXTransformerFactory实例
SAXTransformerFactory tff = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
// 2、创建TransformerHandler,负责生成xml节点
TransformerHandler handler = tff.newTransformerHandler();
// 3、创建Transformer,要使其生效,一定要放在TransformerHandler.setResult之前
Transformer transform = handler.getTransformer();
// 4、通过Transformer对象对生成的xml维恩爱你进行配置
transform.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transform.setOutputProperty(OutputKeys.ENCODING, "yes");
File file = new File("book1.xml");
// 5、创建一个Result对象,Result对象相当于对将要生成的xml文件的封装
Result reslut = new StreamResult(file);
// 6、将Result对象与handler关联
handler.setResult(reslut);


五、利用TransformerHandler对象进行xml文件编写,生成xml节点

TransformerHandler有如下几个常用的方法

startDocument,开始生成xml文档

startElement,开始生成节点

characters,填入标签中的文本

endElement,节点结束

endElement,xml文档结束


//利用handler对象进行xml文件编写
handler.startDocument();
handler.startElement("", "", "bookstore", null);
for (Book book : bookList) {
	// 生成属性的工具类
	AttributesImpl attr = new AttributesImpl();
	attr.addAttribute("", "", "id", "", book.getId());
	handler.startElement("", "", "book", attr);
	if (book.getName() != null) {
		handler.startElement("", "", "name", null);
		handler.characters(book.getName().toCharArray(), 0, book.getName().length());
		handler.endElement("", "", "name");
	}
	if (book.getAuthor() != null) {
		handler.startElement("", "", "author", null);
		handler.characters(book.getAuthor().toCharArray(), 0, book.getAuthor().length());
		handler.endElement("", "", "author");
	}
	if (book.getEdition() != null) {
		handler.startElement("", "", "edition", null);
		handler.characters(book.getEdition().toCharArray(), 0, book.getEdition().length());
		handler.endElement("", "", "edition");
	}

	if (book.getPrice() != null) {
		handler.startElement("", "", "price", null);
		handler.characters(book.getPrice().toCharArray(), 0, book.getPrice().length());
		handler.endElement("", "", "price");
	}

	if (book.getYear() != null) {
		handler.startElement("", "", "year", null);
		handler.characters(book.getYear().toCharArray(), 0, book.getYear().length());
		handler.endElement("", "", "year");
	}

	handler.endElement("", "", "book");



六、结果

生成一个book1.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
	<book id="156">
		<name>计算机网络</name>
		<author>谢希仁</author>
		<price>39</price>
		<year>2013</year>
	</book>
	<book id="234">
		<name>计算机操作系统</name>
		<author>佚名</author>
		<edition>第四版</edition>
		<price>40</price>
		<year>2013</year>
	</book>
	<book id="367">
		<name>计算机组成原理</name>
		<edition>第三版</edition>
		<price>35</price>
		<year>2013</year>
	</book>
</bookstore>


完成代码如下

public class SaxXmlCreator {

	public static void main(String[] args) {
		List<Book> bookList = SaxXmlParser.parseXml();
		// 1、创建SAXTransformerFactory实例
		SAXTransformerFactory tff = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
		try {
			// 2、创建TransformerHandler
			TransformerHandler handler = tff.newTransformerHandler();
			// 3、创建Transformer,要使其生效,一定要放在TransformerHandler.setResult之前
			Transformer transform = handler.getTransformer();
			// 4、通过Transformer对象对生成的xml维恩爱你进行配置
			transform.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
			transform.setOutputProperty(OutputKeys.ENCODING, "yes");
			File file = new File("book1.xml");
			// 5、创建一个Result对象
			Result reslut = new StreamResult(file);
			// 6、将Result对象与handler关联
			handler.setResult(reslut);
			// 7、利用handler对象进行xml文件编写
			handler.startDocument();
			handler.startElement("", "", "bookstore", null);

			for (Book book : bookList) {
				// 生成属性的工具类
				AttributesImpl attr = new AttributesImpl();
				attr.addAttribute("", "", "id", "", book.getId());
				handler.startElement("", "", "book", attr);
				if (book.getName() != null) {
					handler.startElement("", "", "name", null);
					handler.characters(book.getName().toCharArray(), 0, book.getName().length());
					handler.endElement("", "", "name");
				}
				if (book.getAuthor() != null) {
					handler.startElement("", "", "author", null);
					handler.characters(book.getAuthor().toCharArray(), 0, book.getAuthor().length());
					handler.endElement("", "", "author");
				}
				if (book.getEdition() != null) {
					handler.startElement("", "", "edition", null);
					handler.characters(book.getEdition().toCharArray(), 0, book.getEdition().length());
					handler.endElement("", "", "edition");
				}

				if (book.getPrice() != null) {
					handler.startElement("", "", "price", null);
					handler.characters(book.getPrice().toCharArray(), 0, book.getPrice().length());
					handler.endElement("", "", "price");
				}

				if (book.getYear() != null) {
					handler.startElement("", "", "year", null);
					handler.characters(book.getYear().toCharArray(), 0, book.getYear().length());
					handler.endElement("", "", "year");
				}

				handler.endElement("", "", "book");
			}
			handler.endElement("", "", "bookstore");
			handler.endDocument();
		} catch (TransformerConfigurationException | SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值