SAX解析xml基础
SAX解析原理
加载一点,读取一点,处理一点,如果读取到内容你不使用的话,就没有了。
SAX解析的工具
sun公司提供的解析工具,已经内置在JDK中。
核心API
在javax.xml.parsers包中的SAXparser类中存在大量的方法让我们去使用SAX解析。
* SAXparser类:用于读取和解析xml文件对象
* parse(File f,DefaultHandler dh)方法,是我们常用的解析xml的方法
* File f 参数代表将要读取的xml文件
* DefaultHandler dh 参数是SAX事件处理程序,它是SAX时间处理程序的基类,所以我们通常不会直接去new其对象,而是采用其子类去new该类的对象。
* startDocument(); //在读到文档开始时调用
* endDocument();//读到文档的结束时会调用
* startElement();//在读到开始标签时调用,属性也被在该函数的参数中传递
* endElement();//读到文档的结束标签时调用
* characters();//读到文本内容时调用的方法
DefaultHandler类的使用原则
因为DefaultHandler类是所有SAX解析程序的基类,对于这种基类,我们一般不会直接事情其构造对象,在本文的测试实例中,我们继承了DefaultHandler类,实现了自己的MyDefaultHandler类,并重写了其中的5个方法,在这5个方法中写我们自己的处理逻辑。
代码实现
- TestSAXParser.java@H_403_17@
package com.jpzhutech.sax;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
public class TestSAXParser {
public static void main(String[] args)throws IOException{
try {
//创建SAXparser对象
SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser(); //用工厂拿到SAXParser的实例,因为SAXParser的构造方法是protected
//调用开始解析xml文档
saxParser.parse(new File("./src/contact.xml"),new MyDefaultHandler());
} catch (ParserConfigurationException | SAXException e) {
throw new RuntimeException(e);
}
}
}
- MyDefaultHandler.java@H_403_17@
package com.jpzhutech.sax;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
/** * SAX的处理程序,处理逻辑都在这个类中写 */
import org.xml.sax.helpers.DefaultHandler;
public class MyDefaultHandler extends DefaultHandler {
@Override
public void startDocument() throws SAXException {
System.out.println("调用startDocument方法");
}
@Override
public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException { //qName:开始标签的标签名 attributes:所有的属性都在该对象中
System.out.println("开始标签:"+qName);
//获取开始标签中的属性
for(int i = 0 ; i < attributes.getLength();i++){
String attributeName = attributes.getQName(i);
String value = attributes.getValue(attributeName);
System.out.println(attributeName + "=" + value);
}
}
@Override
public void endElement(String uri,String qName)
throws SAXException { //qName:结束标签名
System.out.println("结束标签"+qName);
}
@Override
public void characters(char[] ch,int start,int length)
throws SAXException { //ch:表示已经读完的所有文本内容 start:当前文本内容的开始位置 length:表示当前文本内容的长度
String string = new String(ch,start,length);
System.out.println("文本内容"+string);
}
@Override
public void endDocument() throws SAXException {
System.out.println("结束文档");
}
}
- contact.xml@H_403_17@
<?xml version="1.0" encoding="utf-8" ?>
<contactlist>
<contact id="001" name="eric">
<name>张三</name>
<telephone>15338607192</telephone>
<age>20</age>
<email>zhangsan@qq.com</email>
<qq>13101900</qq>
</contact>
<contact id="002">
<name>李四</name>
<telephone>15338607193</telephone>
<age>20</age>
<email>lisi@qq.com</email>
<qq>13101901</qq>
</contact>
<contact id="003">
<name>王五</name>
<telephone>15338607194</telephone>
<age>21</age>
<email>wangwu@qq.com</email>
<qq>13101902</qq>
</contact>
<ABC>
</ABC>
</contactlist>