SAX解析XML文档

博客介绍了SAX解析和生成XML文档的实现思路。解析方面,需引入Xerces - J的jar包,自定义事件监听器,创建SAX解析器工厂和解析器对象并调用parse方法。生成方面,要创建结果流对象,获取sax生产相关实例来生产文档及元素。

实现思路:

  1. 在工程中引入Xerces-J具体解析器实现类jar包
  2. 自定义事件监听器继承自DefaultHandler
  3. 通过SAXparseFactory的newInstance()方法创建SAX解析器工厂对象
  4. 通过SAXparseFactory对象的newSAXparser()方法创建SAXParser对象
  5. 调用SAXParser对象的parse()方法解析XML文档

package com.muke.sax;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

import com.muke.sax.handler.Handler;

public class SAXParse {

	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		// TODO Auto-generated method stub
		// 1、获取sax解析器的工厂对象
		SAXParserFactory factory = SAXParserFactory.newInstance();
		// 2、通过工厂对象SAXPArser创建解析器
		SAXParser saxParser = factory.newSAXParser();
		// 3、通过解析saxParser的parse()方法设定解析的文件和自己定义的事件处理对象
		saxParser.parse("C://Users/admin/Desktop/data.xml", new Handler());
	}

}复制代码

自定义监听器

package com.muke.sax.handler;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class Handler extends DefaultHandler {
	// 定义一个变量来保存当前正在处理的tag
	private String currentTag;
	
	// 每当处理文本数据时将触发该方法
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		String content = new String(ch,start,length);
		if(content.trim().length()>0){
			System.out.println("<"+currentTag+">元素的值是:"+content);
		}
	}

	// 解析文档结束时触发该方法
	@Override
	public void endDocument() throws SAXException {
		System.out.println("解析文档结束");
	}

	// 每当解析元素时结束该方法
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		System.out.println("处理元素结束:"+qName);
	}

	// 解析文档开始时
	@Override
	public void startDocument() throws SAXException {
		System.out.println("解析文档开始");
	}

	// 每当解析元素开始时触发该方法
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		System.out.println("开始处理元素:"+qName);
		currentTag=qName;
		if(attributes.getLength()>0){
			System.out.println("<"+currentTag+">元素的属性如下:");
			for(int i=0;i<attributes.getLength();i++){
				System.out.println(attributes.getQName(i)+"---->"+attributes.getValue(i));
			}
		}
	}
	
}复制代码

SAX生成XML文档

实现思路:

  1. 创建保存XML的结果流对象
  2. 获取sax生产工厂对象实例
  3. 获取sax生产处理者对象实例
  4. 获取sax生产器
  5. 生产文档以及文档中的元素

package com.muke.sax;

import java.io.File;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;

import org.xml.sax.helpers.AttributesImpl;

public class SaxCreateXML {

	public static void main(String[] args) throws Exception{
		// 1、创建保存XML的结果流对象
		StreamResult resultXML = new StreamResult(new File("C://Users/admin/Desktop/datas.xml"));
		// 2、获取sax生成工厂实例
		SAXTransformerFactory saxTransformerFactory=(SAXTransformerFactory)SAXTransformerFactory.newInstance();
		// 3、获取SAX生产处理对象实例
		TransformerHandler transformerHandler=saxTransformerFactory.newTransformerHandler();
		transformerHandler.setResult(resultXML);
		//获取SAX生成器
		Transformer transformer=transformerHandler.getTransformer();
		// 设置参数,允许设置空格
		transformer.setOutputProperty(OutputKeys.INDENT, "yes");
		//因为默认生成的文档字符编码为utf-8,故不多做设置
		
		// 生成文档开始
		transformerHandler.startDocument();
		
		// 生成属性,此处生成空属性,设置属性可以使用AttributesImpl.add方式来设置
		AttributesImpl attributesImpl=new AttributesImpl();
		
		//生成元素开始
		transformerHandler.startElement("", "", "书籍列表", attributesImpl);
		
		transformerHandler.startElement("", "", "计算机书籍", attributesImpl);
		transformerHandler.startElement("", "", "书名", attributesImpl);
		transformerHandler.characters("Java思想".toCharArray(), 0, "Java思想".length());
		transformerHandler.endElement("", "", "书名");
		transformerHandler.endElement("", "", "计算机书籍");
		
		transformerHandler.startElement("", "", "计算机书籍", attributesImpl);
		transformerHandler.startElement("", "", "书名", attributesImpl);
		transformerHandler.characters("Spring指南".toCharArray(), 0, "Spring指南".length());
		transformerHandler.endElement("", "", "书名");
		transformerHandler.endElement("", "", "计算机书籍");
		
		transformerHandler.endElement("", "", "书籍列表");
		
		transformerHandler.endDocument();
		
		System.out.println("生成文档成功!");
	}

}
复制代码



转载于:https://juejin.im/post/5cd13672e51d453acd5050bd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值