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));
}
}