* XML的编程
* JAXP的SAX解析(了解的怎么样解析)
* 只能做查询,不能做增删改。
* SAX解析(需要:解析器和时间处理器)
* 解析器
* 获取解析器的工厂
* 获取解析器对象
* 解析XML(XML的文件的地址,事件处理器)
* 事件处理器
* 自己编写的类,需要继承DefalutHandler类,重写三个方法。
* startElement()
* characters()
* endElement()
注意:startDocument默认自动识别<?xml version=”1.0” encoding=”UTF_8”>
endDocument默认自动识别结束标签</root>
* SAX的解析原理:
解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分(边读边解析),都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前 解析到的xml文件内容作为方法的参数传递给事件处理器。
事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。
箭头代表进行解析时,默认的自动调用的方法。
Sax解析步骤
*创建一个类继承DefaultHandl
*重写三个方法
package cn.itcast.jaxp.sax; 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; /** * SAX的入门 * @author Administrator * */ public class JaxpSaxTest { public static void main(String[] args) { try { run1(); } catch (Exception e) { e.printStackTrace(); } } /** * 获取所有的解析的内容 * @throws Exception * @throws ParserConfigurationException */ public static void run1() throws Exception{ // 获取SAX的解析器工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); // 获取解析器 SAXParser parser = factory.newSAXParser(); // 解析 parser.parse("src/book2.xml", new MyHandler2()); } } /** * 获取作者标签的文本内容 * */ class MyHandler2 extends DefaultHandler{ // 如果解析到作者标签的时候,flag设置成true private boolean flag = false; private int count = 0; /** * 默认解析开始标签,默认调用该方法 */ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 如果要是作者标签,flag设置成true if("作者".equals(qName)){ flag = true; count++; } } /** * 能控制characters的输出,我只在解析作者标签的时候,才打印 */ public void characters(char[] ch, int start, int length) throws SAXException { // 如果flag是true,就打印 // 每一次都打印 if(flag && count == 1){ String str = new String(ch,start,length); System.out.println(str); } } /** * */ public void endElement(String uri, String localName, String qName) throws SAXException { // flag恢复成false flag = false; } } /** * 自己事件处理器 * 重写三方法 * @author Administrator * */ class MyHandler extends DefaultHandler{ /** * 只要一解析到开始标签的时候,默认调用该方法,把解析的内容赋值给参数。 */ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("开始标签:"+qName); } /** * 只要解析到文本的内容,默认调用该方法 */ public void characters(char[] ch, int start, int length) throws SAXException { String str = new String(ch,start,length); System.out.println(str); } /** * 解析到结束标签的时候,默认调用方法,把解析的内容赋值给参数。 */ public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("结束标签:"+qName); } }