1 sax解析的原理
事件驱动,边读边解析
两个类 SAXParser SAXParserFactory
解析方法:parse(xml的路径,事件处理器)
解析过程:
当解析到开始标签的时候,执行startElement方法,参数qName返回标签名称。
当解析到开始标签的时候,执行characters方法,通过starting的构造方法返回内容
当解析到开始标签的时候,执行endElement方法,参数qName返回标签名称。
2 使用jaxp的sax方式解析xml
sax方式不能实现增删改操作,只能做查询操作
** 打印整个文档
package cn.jaxptest; 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 { /* * 1、 创建解析器工厂 * 2、创建解析器 * 3、执行parse方法 * 4、创建一个类,继承DefaultHandler * 5、 重写类里面的三个方法 */ public static void main(String[] args) throws Exception { SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); SAXParser saxParser = saxParserFactory.newSAXParser(); //执行parse方法,第一个参数是xml路径,第二个参数是时间处理器(会自动执行里面的三个方法) saxParser.parse("src/person.xml", new Mydefault()); } } class Mydefault 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 { // TODO Auto-generated method stub System.out.print(new String(ch, start, length)); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.print("</"+qName+">"); } }
3 打印出所有name标签里的内容
class Mydefault extends DefaultHandler { boolean flag=false; @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 { // TODO Auto-generated method stub //当flag是true时,表示解析到name元素 if(flag==true) { System.out.println(new String(ch, start, length)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("name".equals(qName)) { flag=false; } } }