本文主要是介绍JAXP的SAX解析方式(理解过程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.JAXP的DOM解析方式和SAX解析方式的区别:
1.DOM:在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。
2.SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。
2.JAXP的SAX解析(了解 解析的过程)
2.1* 只能做查询,不能做增删改。
2.2* SAX解析:解析器自动帮我们
1.* 解析器
1.* 获取解析器的工厂
2.* 获取解析器对象
3.* 解析XML(XML的文件的地址,事件处理器:DefaultHandler)
2.* 事件处理器
* 自己编写的类,需要继承DefalutHandler类,重写三个方法。
* startElement()
* characters()
* endElement()3. 图示:
4.代码示例:
<pre name="code" class="java">package cn.itcast.jaxp.sax;import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler;public class JaxpSaxTest {public static void main(String[] args) {try {run1();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 获取所有的解析内容* */public static void run1() throws Exception{//获取SAX的解析工厂SAXParserFactory factory = SAXParserFactory.newInstance();//获取解析器SAXParser parser = factory.newSAXParser();//解析parser.parse("src/book2.xml", new MyHandler2());} }/*** 获取作者标签文本*/ class MyHandler2 extends DefaultHandler{private boolean flag = false;//解析到作者标签时置为trueprivate int count = 0;@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {if("作者".equals(qName)){flag = true;count++;}}/*** 控制characters的输出,只在解析坐着吧标签的时候才打印*/@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {//flag为true时才打印if(flag && count==1){String str = new String(ch, start, length);//将拿到的文本拼接成一个字符串System.out.println(str);}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {//flag恢复到falseflag = false;}}/*** 自己事件处理器* 重名三方法* */ class MyHandler extends DefaultHandler{/*** 只要一解析到开始标签的时候,默认调用该方法,把解析的内容赋值给参数*/@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {System.out.println("开始标签: " + qName);}/*** 只要解析到文本内容,就调用该方法*/@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {String str = new String(ch, start, length);//将拿到的文本拼接成一个字符串System.out.println(str);}/*** 解析到结束标签,默认调用该方法*/@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {System.out.println("结束标签: " + qName);} }
2.3* SAX的解析原理:
解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,(边读边解析)
都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,
会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
事件处理器由程序员编写,程序员通过事件处理器中方法的参数,
就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。
这篇关于JAXP的SAX解析方式(理解过程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!