SAX实现对XML文件的解析
2015-09-17 15:53
113 查看
可扩展标记语言XML(eXtensible Markup Language)是一种简单灵活的文本格式的可扩展标记语言。可扩展即可自定义标记语言。
与HTML相比,XML是被设计为传输和存储数据,其焦点是数据的内容。而HTML是被设计用来显示数据的,侧重在数据的外观。其二,
在语法上,HTML的标记并不是所有的都需要成对出现,不区分大小写;但XML严格要求成对出现,且大小写敏感。
SAX的原理:
SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档开始与结束、元素开始与结束等等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
大多数SAX实现都会产生以下类型的事件:
1)在文档的开始和结束时触发文档处理事件
2)在文档内每一XML元素接受解析的前后触发元素事件
3)任何元素据通常都由单独的事件交付
4)在处理文档的DTD或Schema时产生DTD或Schema事件
5)产生错误事件用来通知主机应用程序解析错误
简单实例:
public class XMLHandler extends DefaultHandler{
//DefaultHandler与MouseAdapter作用一样
//以下方法为选择性实现ContentHandler接口中的5个抽象方法
@Override
public void startDocument() throws SAXException{
super.startDocment();
System.out.println("-------startDocument--------------");
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("-------endDocument--------------");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//localName是带后缀标记 qName是不带后缀的标记 attributes是标签属性,例如ID
super.startElement(uri, localName, qName, attributes);
System.out.println("-------startElement--------------");
System.out.println("startElement loaclName="+localName);
for(int i=0;i<attributes.getLength();i++){
System.out.println(attributes.getLocalName(i)+"="+attributes.getValue(i));
}
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName);
System.out.println("-------endElement------------LocalName="+localName);
}
@Override
public void characters(char[] ch, int start, int length)throws SAXException{
super.characters(ch,start,length);
System.out.println("-------characters--------------");
//构造字符串
String content=new String(ch,start,length);
System.out.println("content="+content);
}
}
给定一份文件user.xml
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1" color="red">
<name>张三</name>
<sex>男</sex>
<address>衡阳</address>
</user>
<user id="2">
<name>李四</name>
<sex>女</sex>
<address>长沙</address>
</user>
</users>
进行解析步骤
1.得到SAX解析工厂类对象
SAXParserFactory factory=SAXParserFactory.newInstance();
2.获取SAX解析器
SAXParser parser=factory.getXMLReader();
reader.setContentHandler(new XMLHandler()); //xml解析器会调用ContentHandler接口中相应的方法来响应该事件。
reader.parse(new InputSource(new StringReader(resultStr))); //resultStr是指user.xml文件内容(IO处理为String类型)
}
与HTML相比,XML是被设计为传输和存储数据,其焦点是数据的内容。而HTML是被设计用来显示数据的,侧重在数据的外观。其二,
在语法上,HTML的标记并不是所有的都需要成对出现,不区分大小写;但XML严格要求成对出现,且大小写敏感。
SAX的原理:
SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档开始与结束、元素开始与结束等等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
大多数SAX实现都会产生以下类型的事件:
1)在文档的开始和结束时触发文档处理事件
2)在文档内每一XML元素接受解析的前后触发元素事件
3)任何元素据通常都由单独的事件交付
4)在处理文档的DTD或Schema时产生DTD或Schema事件
5)产生错误事件用来通知主机应用程序解析错误
简单实例:
public class XMLHandler extends DefaultHandler{
//DefaultHandler与MouseAdapter作用一样
//以下方法为选择性实现ContentHandler接口中的5个抽象方法
@Override
public void startDocument() throws SAXException{
super.startDocment();
System.out.println("-------startDocument--------------");
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("-------endDocument--------------");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//localName是带后缀标记 qName是不带后缀的标记 attributes是标签属性,例如ID
super.startElement(uri, localName, qName, attributes);
System.out.println("-------startElement--------------");
System.out.println("startElement loaclName="+localName);
for(int i=0;i<attributes.getLength();i++){
System.out.println(attributes.getLocalName(i)+"="+attributes.getValue(i));
}
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName);
System.out.println("-------endElement------------LocalName="+localName);
}
@Override
public void characters(char[] ch, int start, int length)throws SAXException{
super.characters(ch,start,length);
System.out.println("-------characters--------------");
//构造字符串
String content=new String(ch,start,length);
System.out.println("content="+content);
}
}
给定一份文件user.xml
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1" color="red">
<name>张三</name>
<sex>男</sex>
<address>衡阳</address>
</user>
<user id="2">
<name>李四</name>
<sex>女</sex>
<address>长沙</address>
</user>
</users>
进行解析步骤
1.得到SAX解析工厂类对象
SAXParserFactory factory=SAXParserFactory.newInstance();
2.获取SAX解析器
SAXParser parser=factory.getXMLReader();
reader.setContentHandler(new XMLHandler()); //xml解析器会调用ContentHandler接口中相应的方法来响应该事件。
reader.parse(new InputSource(new StringReader(resultStr))); //resultStr是指user.xml文件内容(IO处理为String类型)
}
相关文章推荐
- 8266Ubuntu环境
- iOS BUG整理-记录我近期视频开发遇到的问题
- 09.17,习题1
- 黑马程序员----OC语法之简明扼要的总结一
- Android学习笔记之——GridView
- Android中 ScrollView(ListView)中嵌套ListView时显示不全的简便解决方案
- 《程序员面试金典》--删除链表中的某个元素(这个元素只能访问)
- CodeForces 579A - Raising Bacteria
- EOJ 1051:(算法作业4-1)完全加括号的矩阵连乘积(DP)
- centos 安装FTP server详情
- 模板 lucas
- ProxyFactory的一个问题
- MVVM范例:实现 用户列表绑定、编辑 、删除、添加及筛选功能
- 为什么这些脑残应用能活,而那些严肃牛逼的应用死了?
- 活动的启动模式
- 清楚浏览器自动记忆输入的信息
- Spring AOP Example – Advice
- iOS 8 Metal Swift教程 :开始学习
- mocall/free和new/delete的区别
- 清楚浏览器自动记忆输入的信息