XMl的解析原理
通过dom和sax根据XM中层级结构在内存中分配一个树形结构,把xml标签,属性,文本分装成一个对象
sax解析方式:边解析,边驱动。
在java.xml.parsers包内:
SAXParser 此类的实例可以从SAXParseFactory.newSAXParse()方法获得。
parse(File f, DefaultHanldler dh)方法 File:下面了路径 DefaultHanldler:时事件处理器
执行parse方法当把事件处理器传递过来,相当于在方法里面绑定了一个事件。
SAXParseFactory 实例newInstance()方法得到
使用jaxp的sax方法解析xml:
sax方法只能执行查询操作
sax方式不能实现增删改操作,只能做查询操作
- 打印出整个文档
- 执行parse方法,第一个参数xml路径,第二个参数是 事件处理器
- 创建一个类,继承事件处理器的类,
- 重写里面的三个方法
package cn.sax.lianxi; import java.io.IOException; 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 Testsax { public static void main(String[] args) throws Exception { /* * 1.创建解析气工厂 * 2.创建解析器 * 3.执行parse方法 * 4.自创一个类,继承DefaultHandler * 5.重写类里的三个方法 */ SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); SAXParser saxParser = saxParserFactory.newSAXParser(); saxParser.parse("saxjiexi.xml", new MyDefault1()); } } class MyDefault1 extends DefaultHandler{ boolean flag=false; int idx=1; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // System.out.println("start:" + qName); if("name".equals(qName) && idx==1) flag = true; } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("name".equals(qName)) { flag = false; idx++; } // System.out.println("end" + qName); } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(flag==true) System.out.println(new String(ch,start,length)); } }