JAXP 的 sax 解析,边读边解析,只能做查询的操作,不能做增删改的操作
1、解析器
2、事件处理器
开始解析xml的文档,解析器会去调用默认的事件处理器的方法,解析完成后会把内容传给事件处理器中参数,
book.xml
<?xml version="1.0" encoding="UTF-8"?>
<book>
<name>java</name>
<author>ldh</author>
</book>
TestSax.java ,获取 xml 文件中 name 节点的值(“java”)
package JAXP.SAX;
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 {
run1();
}
public static void run1() throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse("src/book.xml", new MyHanlder());
}
}
//事件处理器类
class MyHanlder extends DefaultHandler {
String startTag = "";
String endTag = "";
//当解析到开始节点的时候调用,qName为节点名,attributes 为属性名
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
startTag = qName;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(startTag.equals("name") && !endTag.equals("name")){
System.out.println("name : "+new String(ch,start,length));
}
}
//解析到结束节点的时候调用 aName 为结束节点名
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
endTag = qName;
}
}