简介:
jdk自带的,基于事件驱动,有两个部分,解析器和事件处理器,解析器就是XMLReader接口,负责读取XML文档,和想事件处理器发送事件,事件处理器ContentHandler接口,负责对发送的事件响应和进行xml文档处理。
ContentHandler接口的常用方法:
startDocument() 接受文档开始的通知
endDocument() 接受文档结束的通知
startElenment() 接收文档开始的标签
endElement() 接收文档结束的标签
characters() 接收字符块通知
一般步骤:
1、使用SAXParseFactory创建SAX解析工厂
2、通过SAX解析工厂得到解析器对象
3、通过解析器对象得到一个xml的读取器
4、设置读取器的时间处理器
5、解析xml文件
解析代码示意:
事件处理器:
import java.util.ArrayList;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class GameHanlder extends DefaultHandler {private List<Game> list = null;private Game g = null;//设置标签的名称 作为标记private String tag = null;public List<Game> getList() {return list;}/*** 创建list*/@Overridepublic void startDocument() throws SAXException {list = new ArrayList<Game>();}/*** 遇到开始标签*/@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {if ("game".equals(qName)) {g = new Game();}for (int i = 0; i < attributes.getLength(); i++) {String temp = attributes.getQName(i);System.out.println(temp +" "+attributes.getValue(temp));}tag = qName;}/*** 遇到结束标签*/@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {if ("game".equals(qName)) {list.add(g);g = null;}}/*** 内容*/@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {if ("id".equals(tag)) {g.setId(new String(ch, start, length));}else if ("name".equals(tag)) {g.setName(new String(ch, start, length));}else if ("company".equals(tag)) {g.setCompany(new String(ch, start, length));}tag = null;}/*** 结束文档*/@Overridepublic void endDocument() throws SAXException {System.out.println("我就打印下");}}
解析过程代码示意:
import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.XMLReader;public class SaxDemo01 {public static void main(String[] args) {try {//创建工厂SAXParserFactory factory = SAXParserFactory.newInstance();//从工厂里面拿呗SAXParser parser = factory.newSAXParser();//读XMLReader reader = parser.getXMLReader();//创建事件处理器GameHanlder hanlder = new GameHanlder();//设置处理器reader.setContentHandler(hanlder);//解析吧reader.parse("xml/mygame.xml");for (Game g : hanlder.getList()) {System.out.println(g);}} catch (Exception e) {e.printStackTrace();}}}
利用sax解析创建xml文件:
一般步骤:
1、确定输出到文件】
2、创建一个xml的转换工厂
3、从工厂里面得到转换器
4、设置转换器输出文档的位置
5、从转换器里面得到转换者
6、开始创建xml
|--设置编码
|--开始文档
|--添加节点
|--结束节点
|--结束文档
代码示意:
import java.io.File;import java.util.ArrayList;import java.util.List;import javax.xml.transform.OutputKeys;import javax.xml.transform.Result;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 SAXWrite {public static void main(String[] args) {List<Game> list = new ArrayList<Game>();list.add(new Game("1", "dota", "暴雪"));list.add(new Game("2", "lol", "腾讯"));String path = "xml/mygames.xml";createXML(list, path);}public static void createXML(List<Game> list, String path){try {//确定输出到ymgame.xmlResult rs = new StreamResult(new File(path));//创建一个XML的转换工厂SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();//从工厂里面得到转换器TransformerHandler tfh = factory.newTransformerHandler();//设置转换器输出到文档的位置tfh.setResult(rs);//从转换器中得到转换者Transformer tf = tfh.getTransformer();//开始创建xml//设置编码tf.setOutputProperty(OutputKeys.ENCODING, "utf-8");//开始文档tfh.startDocument();//定义一个空的属性对象AttributesImpl atts = new AttributesImpl();//添加节点tfh.startElement(null, null, "games", atts);for (Game game : list) {//添加ID属性atts.addAttribute(null, null, "id", null, game.getId());tfh.startElement(null, null, "game", atts);atts.clear();//添加nametfh.startElement(null, null, "name", atts);tfh.characters(game.getName().toCharArray(), 0, game.getName().toCharArray().length);tfh.endElement(null, null, "name");//添加companytfh.startElement(null, null, "company", atts);tfh.characters(game.getCompany().toCharArray(), 0, game.getCompany().toCharArray().length);tfh.endElement(null, null, "company");tfh.endElement(null, null, "game");}tfh.endElement(null, null, "games");//结束文档tfh.endDocument();} catch (Exception e) {e.printStackTrace();}}}
684

被折叠的 条评论
为什么被折叠?



