XML解析&SAX

简介:
     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
*/
@Override
public void startDocument() throws SAXException {
list = new ArrayList<Game>();
}
/**
* 遇到开始标签
*/
@Override
public 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;
}
/**
* 遇到结束标签
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if ("game".equals(qName)) {
list.add(g);
g = null;
}
}
/**
* 内容
*/
@Override
public 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;
}
/**
* 结束文档
*/
@Override
public 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.xml
Result 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();
//添加name
tfh.startElement(null, null, "name", atts);
tfh.characters(game.getName().toCharArray(), 0, game.getName().toCharArray().length);
tfh.endElement(null, null, "name");
//添加company
tfh.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();
}
}
 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值