欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Xml 解析:(sax 解析)

程序员文章站 2022-06-16 15:45:44
...

sax解析的原理()
     解析xml有两种技术 dom 和sax

     根据xml的层级结构在内存中分配一个树形结构
     把xml中标签,属性,文本封装成对象

     sax方式:事件驱动,边读边解析

Xml 解析:(sax 解析)
     Xml 解析:(sax 解析)


在javax.xml.parsers包里面
     1 SAXParser (SAXParser 是抽象类,所以不能new ) 

Xml 解析:(sax 解析)

          此类的实例可以从 SAXParserFactory.newSAXParser() 方法获得
            - parse(File f, DefaultHandler dh)  两个参数
                 第一个参数:xml的路径
                 事件处理器

         2 SAXParserFactory
             实例 newInstance() 方法得到
         画图分析一下sax执行过程
         当解析到开始标签时候,自动执行startElement方法
         当解析到文本时候,自动执行characters方法
         当解析到结束标签时候,自动执行endElement方法

4、使用jaxp的sax方式解析xml(会写)    
     sax方式不能实现增删改操作,只能做查询操作
     打印出整个文档
     执行parse方法,第一个参数xml路径,第二个参数是 事件处理器
         创建一个类,继承事件处理器的类,
        重写里面的三个方法
    
      获取到所有的name元素的值
         定义一个成员变量 flag= false
         判断开始方法是否是name元素,如果是name元素,把flag值设置成true
         如果flag值是true,在characters方法里面打印内容
         当执行到结束方法时候,把flag值设置成false

      获取第一个name元素的值
         定义一个成员变量 idx=1
         在结束方法时候,idx+1 idx++
         想要打印出第一个name元素的值,
            - 在characters方法里面判断,
            -- 判断flag=true 并且 idx==1,在打印内容

 

package cn.itcast.jaxpsax;

import javax.xml.parsers.ParserConfigurationException;
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();
		//执行parse方法
		saxParser.parse("src/p1.xml", new MyDefault2());	
	}
	
}

//实现获取所有的name元素的值
class MyDefault2 extends DefaultHandler {

	boolean flag = false;
	int idx = 1;
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		//判断qName是否是name元素
		if("name".equals(qName)) {
			flag = true;			
		}
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		//当flag值是true时候,表示解析到name元素
		//索引是1
		if(flag == true && idx == 2) {
			System.out.println(new String(ch,start,length));
		}
	}
	
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		//把flag设置成false,表示name元素结束
		if("name".equals(qName)) {
			flag = false;
			idx++;
		}
	}

}

class MyDefault1 extends DefaultHandler {

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		System.out.print("<"+qName+">");
	}
	
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		System.out.print(new String(ch,start,length));
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		System.out.print("</"+qName+">");
	}

}

Xml 解析:(sax 解析)

<?xml version="1.0" encoding="UTF-8"?>

<person> 
  <p1 id1="aaaa"> 
    <name>zhangsan</name>  
    <age>300</age>  
    <sex>nv</sex> 
  </p1>  
  <p1> 
    <name>lisi</name>  
    <age>30</age> 
  </p1> 
</person>