package com.imooc.sax;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MyHanndler extends DefaultHandler{
//定义一个变量来保存当前正在处理的tag
private String currentTag;
/* (非 Javadoc)
* 解析文档开始时触发该方法
*/
@Override
public void startDocument() throws SAXException {
// TODO 自动生成的方法存根
System.out.println("解析文档开始时触发该方法");
}
/* (非 Javadoc)
* 解析文档结束时触发该方法
*/
@Override
public void endDocument() throws SAXException {
// TODO 自动生成的方法存根
System.out.println("解析文档结束时触发该方法");
}
/* (非 Javadoc)
* 解析元素开始时触发该方法
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO 自动生成的方法存根
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));
}
}
}
/* (非 Javadoc)
* 解析元素结束时触发该方法
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO 自动生成的方法存根
System.out.println("解析元素结束 "+qName);
}
/* (非 Javadoc)
* 每当处理文本数据时将触发该方法
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO 自动生成的方法存根
String content=new String(ch, start, length);
if(content.trim().length()>0) {
System.out.println("<"+currentTag+">元素的值是:"+content.trim());
}
}
}
package com.imooc.sax;
import java.io.IOException;
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;
public class SAXParse {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerConfigurationException {
SAXParse a=new SAXParse();
//a.read_xml();
a.write_xml();
}
//解析XML
public void read_xml() throws SAXException, IOException, ParserConfigurationException {
// 创建SAX解析工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
//创建SAX解析器
SAXParser saxParse=factory.newSAXParser();
//开始解析XML文档
saxParse.parse("E://java_test/book.xml",new MyHanndler());
}
//写出XML
public void write_xml() throws TransformerConfigurationException, SAXException {
//创建保存XML的结果流对象
Result result=new StreamResult("E://java_test/book2.xml");
// 获取SAX工厂实例
SAXTransformerFactory saxTransformerFactor= (SAXTransformerFactory) SAXTransformerFactory.newInstance();
//获取SAX生成处理对象实例
TransformerHandler transformerHandler=saxTransformerFactor.newTransformerHandler();
transformerHandler.setResult(result);
//获取SAX生成器
Transformer transformer=transformerHandler.getTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");//允许生成额外的空格
//生成文档的开始
transformerHandler.startDocument();
//创建属性对象,这里 我不加属性就设置空 ; attri.addAttribute(uri, localName, qName, type, value);
AttributesImpl attri=new AttributesImpl();
transformerHandler.startElement("", "","书籍列表",attri);
transformerHandler.startElement("", "","计算机书籍", attri);
transformerHandler.startElement("", "","书名", attri);
transformerHandler.characters("JAVA思想".toCharArray(), 0, "JAVA思想".length());
transformerHandler.endElement("", "", "书名");
transformerHandler.startElement("", "","作者", attri);
transformerHandler.characters("小王".toCharArray(), 0, "小王".length());
transformerHandler.endElement("", "", "作者");
transformerHandler.startElement("", "","价格", attri);
transformerHandler.characters("79.00".toCharArray(), 0, "79.00".length());
transformerHandler.endElement("", "", "价格");
transformerHandler.endElement("", "", "计算机书籍");
transformerHandler.endElement("", "", "书籍列表");
//文档生成结束
transformerHandler.endDocument();
}
}