1、sax的解析过程
解析xml有两种技术 dom 和sax
根据xml的层级结构在内存中分配一个树形结构
** 把xml中标签,属性,文本封装成对象
* sax方式:事件驱动,边读边解析
在javax.xml.parsers包里面
** SAXParser
此类的实例可以从 SAXParserFactory.newSAXParser() 方法获得
- parse(File f, DefaultHandler dh)
* 两个参数
** 第一个参数:xml的路径
** 第二个参数:事件处理器(DefaultHandler类)
(自己写一个类来继承DefaultHandler,重写下面解析的时候需要的三个方法)
** SAXParserFactory
实例 newInstance() 方法得到
* 画图分析一下sax执行过程
* 当解析到开始标签时候,自动执行startElement方法
* 当解析到文本时候,自动执行characters方法
* 当解析到结束标签时候,自动执行endElement方法
2、使用jaxp的sax方式解析xml
sax方式不能实现增删改操作,只能做查询操作
打印出整个文档
public class TextSax {
public static void main(String[] args) throws Exception {
/*
* 1、创建解析器工厂
* 2、创建解析器
* 3、执行parse方法
*
* 4、自己建一个类继承DefaultHandler类
* 5、重写类中的startElement()characters()和endElement()方法
*
*/
SAXParserFactory spf=SAXParserFactory.newInstance();
SAXParser sp=spf.newSAXParser();
sp.parse("src/p1.xml", new MyDefault1());
}
}
class MyDefault1 extends DefaultHandler{
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
System.out.print("<"+qName+">");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
System.out.println("text"+new String(ch,start,length));
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
System.out.println("</"+qName+">");
}
}
获取到所有的name元素的值
public class TextSax1 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
/*
* 获取到所有的name元素的值
* 定义一个成员变量 flag= false
* 判断开始方法是否是name元素,如果是name元素,把flag值设置成true
* 如果flag值是true,在characters方法里面打印内容
* 当执行到结束方法时候,把flag值设置成false
*/
SAXParserFactory spf=SAXParserFactory.newInstance();
SAXParser sp=spf.newSAXParser();
sp.parse("src/p1.xml", new MyDefault2());
}
}
class MyDefault2 extends DefaultHandler{
boolean flag=false;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
//判断qName是否是name元素
if("name".equals(qName)) {
flag=true;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
//当flag的值为true的时候,表示解析到name元素
super.characters(ch, start, length);
if(flag==true) {
System.out.println(new String(ch,start,length));
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
//把flag元素设置为false,表示name元素结束
if("name".equals(qName)) {
flag=false;
}
}
}
获取第一个name元素的值
public class TextSax2 {
public static void main(String[] args) throws Exception {
/*
* 获取第一个name元素的值
* 定义一个成员变量 idx=1
* 在结束方法时候,idx+1 idx++
* 想要打印出第一个name元素的值,
- 在characters方法里面判断,
-- 判断flag=true 并且 idx==1,在打印内容
*/
SAXParserFactory spf=SAXParserFactory.newInstance();
SAXParser sp=spf.newSAXParser();
sp.parse("src/p1.xml", new MyDefault3());
}
}
class MyDefault3 extends DefaultHandler{
int idx=1;
boolean flag=false;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
if("name".equals(qName)) {
flag=true;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
if(flag==true&&idx==1) {
System.out.println(new String(ch,start,length));
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
if("name".equals(qName)&& idx==1) {
flag=false;
idx++;
}
}
}