java xml解析 sax_Java解析xml——SAX解析

一、Dom解析 VS SAX解析

Dom解析是将整个xml文件加载到内存中,然后再进行相关的操作。

SAX解析是依次读取xml文件的内容,逐个解析。

二、SAX解析实例

books.xml:

<?xml version="1.0" encoding="UTF-8"?> 冰与火之歌乔治马丁201489安徒生童话402004English

SaxDemo.java public class SaxDemo { public static void main(String[] args) { //1、创建SAXParserFactory实例 SAXParserFactory factory = SAXParserFactory.newInstance(); try { //2、创建SAXParser实例 SAXParser parser = factory.newSAXParser(); //3、新建一个类SAXHandler继承DefaultHandler,重写其中的一些方法用来进行业务处理。 //再创建一个SAXHandler对象 SAXHandler handler = new SAXHandler(); //4、进行解析,传入SAXHandler对象作为解析xml的处理类 parser.parse("xml/books.xml", handler); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }SAXHandler.java

public class SAXHandler extends DefaultHandler { int bookIndex = 0; /** * 开始解析xml文件 */ @Override public void startDocument() throws SAXException { super.startDocument(); System.out.println("开始解析xml文件"); } /** * 解析xml文件结束 */ @Override public void endDocument() throws SAXException { super.endDocument(); System.out.println("解析xml文件结束"); } /** * 开始解析xml元素 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); //qName为标签名称 if("book".equals(qName)) { bookIndex++; System.out.println("======开始解析第" + bookIndex + "本书======"); //如果已知标签的属性,则可以直接调用Attributes.getValue(String name)获取属性值 System.out.println("已知book已有id属性,获取属性值-->" + attributes.getValue("id")); //如果不知道标签的属性,则需要遍历Attributes分别获取属性名与属性值 int len = attributes.getLength(); System.out.println("book元素有" + len + "个属性"); for(int i = 0; i < len; i++) { //通过Attributes.getQName(int index)获取属性名称 System.out.print("获取book属性" + attributes.getQName(i)); //通过Attributes.getValue(int index)获取属性值 System.out.println(",属性值-->" + attributes.getValue(i)); } } else if(!"books".equals(qName) && !"bookstore".equals(qName)) { System.out.print("解析到节点" + qName); } } /** * 解析xml元素结束 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); if("book".equals(qName)) { System.out.println("======解析第" + bookIndex + "本书结束======"); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); //ch为整个xml文档的内容,start为当前标签内容所在位置,length为当前标签内容的长度 //需要过滤掉空格和换行,SAX解析也会把空格和换行当做xml文档的内容 String str = new String(ch, start, length); if(!"".equals(str.trim())) { System.out.println("-->节点值:" + str); } } }

运行结果:

开始解析xml文件

======开始解析第1本书======

已知book已有id属性,获取属性值-->1

book元素有1个属性

获取book属性id,属性值-->1

解析到节点name-->节点值:冰与火之歌

解析到节点author-->节点值:乔治马丁

解析到节点time-->节点值:2014

解析到节点price-->节点值:89

======解析第1本书结束======

======开始解析第2本书======

已知book已有id属性,获取属性值-->2

book元素有1个属性

获取book属性id,属性值-->2

解析到节点name-->节点值:安徒生童话

解析到节点price-->节点值:40

解析到节点time-->节点值:2004

解析到节点language-->节点值:English

======解析第2本书结束======

解析xml文件结束

从运行结果可以看出SAX解析Handler处理顺序是:xml文件开头的startDocument-->所有节点startElement-->characters-->endElement-->文件末尾endDocument

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值