【JavaWeb】xml文件_SAX解析(xml文件的解析)
2018-01-25 23:59
337 查看
SAX解析
1.编程理念:基于事件编程的原理2.(1)SAX解析的特点:读取一点,处理一点,解析一点
(2)DOM解析的特点:将整个xml文件加载完毕之后,才开始进行解析(一次性解析)
DOM解析的弊端:使用DOM解析的xml文件内容不能太大,否则会造成内存溢出
3.SAX解析的优点:占用内存小,从占用内从角度考虑SAX解析优于DOM解析
4.SAX解析图解:
开发步骤
(1)创建SAX解析器对象:实例:SAXParser(一个抽象类)SAXParser parser = SAXParserFactory.newIntance().newSAXParser() ;
注:<1>protected SAXParserFactory()
受保护构造方法,以强制使用 newInstance()
<2>public abstract SAXParser newSAXParser()
使用当前配置的工厂参数创建 SAXParser 的一个新实例
(2)创建一个事件处理程序:自定义一个类,继承自DefaultHandler,并且重写几个方法:
<1>startElement(….String qName,Attributes attributes){}
读到开始标签触发这个方法
<2>characters(char[] ch,int start,int length){}
SAX解析器解析xml文件解析到文本内容的时候,就会触发这个方法
<3>endElement(..String qName){}
读到结束标签的时候触发这个方法
(3)读取xml文件
parser.parse(new File(“contact.xml”),基于事件处理程序的对象)
练习1:
/* * SAX解析 * */ import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class SaxTest1 { public static void main(String[] args) throws Exception { // 创建一个SAX解析器,相当于事件源 SAXParser parser = SAXParserFactory.newInstance().newSAXParser() ; // 绑定事件处理程序 // 参数1:通过解析器读取到的xml文件 参数2:编写事件处理程序 parser.parse(new File("./src/contact.xml"), new MyDefaultHandler1()); } }
/* * 事件处理程序(编写监听器) * */ import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MyDefaultHandler1 extends DefaultHandler { // xml文件文档开始时就会触发此方法 @Override public void startDocument() throws SAXException { super.startDocument(); System.out.println("开始读取xml文件"); } /* * 开始标签 * qName:标签名称 * attribute:属性列表 * */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("MyDefaultHandler.startElement():"+qName); } /* * 文本内容: * ch:字符数组 * start:从某个位置处开始读取 * length:读取的实际字符数 * */ @Override public void characters(char[] ch, int start, int length) throws SAXException { String textContent = new String(ch, start, length) ; System.out.println("MyDefaultHandler.characters():"+textContent); } /* * 结束标签 * qName:标签名称 * */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("MyDefaultHandler.endElement():"+qName); } // xml文件读取结束之后就会触发此方法 @Override public void endDocument() throws SAXException { super.endDocument(); System.out.println("xml文件读取完毕"); } }
结果:
练习2:将解析的xml文件,原样输出
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class SaxTest2 {
public static void main(String[] args) {
try {
// 1)创建一个SAX解析器对象
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
// 2)创建事件处理程序
MyDefaultHandler2 handler2 = new MyDefaultHandler2();
// 3)进行解析contact.xml文件
parser.parse(new File("./src/contact.xml"), handler2);
// 返回内容
System.out.println(handler2.getContent());
} catch (Exception e) {
e.printStackTrace();
}
}
}
import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MyDefaultHandler2 extends DefaultHandler { // 目的:使用MyDefaultHandler2事件处理程序,将xml文件的内容打印出来 // 定义一个字符串缓冲区 private StringBuffer sb = new StringBuffer(); // 定义一个成员方法,获得文本内容 public String getContent() { return sb.toString(); } /** * 开始标签 qName:标签名称 attributes:属性列表 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 1)拼接左尖括号+标签名称 sb.append("<" + qName); // 2)拼接属性名称+属性值——Attribytes:属性列表里面包含了很多 标签对应的属性 // 多个属性,进行遍历 for (int i = 0; i < attributes.getLength(); i++) { // 获取到每一个属性属性,通过属性对象获取属性值和属性名称 String name = attributes.getQName(i); // 属性名称 String value = attributes.getValue(i); // 属性值 sb.append(" " + name + "=\"" + value + "\""); } // 3) 拼接右尖括号 sb.append(">"); } /** * 文本内容 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { // length:读取当前实际的字符数 // 将字符数组的一部分转换成字符串,然后在进行拼接 String content = new String(ch, start, length); sb.append(content); } /** * 结束标签 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { // 拼接结束标签 sb.append("</" + qName + ">"); } }
结果:
相关文章推荐
- 【JavaWeb】XML文件_使用SAX解析将xml文件中的联系人封装为对象
- javaXML文件解析(一) SAX解析
- Java读取WEB-INF下XML文件并进行解析
- 【简记】Java Web 内幕——XML介绍,解析XML,DOM和SAX解析
- Java解析XML文件的四种方式之SAX解析
- JavaWeb-05 XML基础(Dom解析和Sax解析)
- Java读取WEB-INF下XML文件并进行解析
- java_web初学笔记之<XML解析技术>
- java 解析由String类型拼接的XML文件方法
- java 对xml文件的解析(转载)
- JAVA解析XML文件
- java解析xml文件获取节点内容
- 不依赖第三方jar包的通过java sax解析本地xml文件的实例代码
- java解析xml文件四种方式
- JAVA解析XML文件(四)---DOM4J方式解析
- 03-JavaWeb-XML-xml编程-dom解析
- 解决java解析XML文件时的“伪属性名称”问题
- Java Web应用中任务调度解析
- Mvc4 web-Api Json 序列化,日期Java解析失败的解决方法
- java web之javascript深度解析(上)