该程序是如何调用characters1(char ch[], int start, int length)和startElement(String uri,String localName,String qName,Attributes attrs)?
不像是继承过来的方法?
package SAX;import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*; public class MyXMLReader extends DefaultHandler { java.util.Stack tags = new java.util.Stack();
public MyXMLReader() {
super();
} public static void main(String args[]) {
long lasting = System.currentTimeMillis();
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
MyXMLReader reader = new MyXMLReader();
sp.parse(new InputSource("data_10k.xml"), reader);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + " 毫秒");
} public void characters1(char ch[], int start, int length) throws SAXException {
System.out.println("characters()");
String tag = (String) tags.peek();
if (tag.equals("NO")) {
System.out.print("车牌号码:" + new String(ch, start, length));
}
if (tag.equals("ADDR")) {
System.out.println(" 地址:" + new String(ch, start, length));
}
} public void startElement(String uri,String localName,String qName,Attributes attrs)
{
System.out.println("startElement().qName:"+qName);
tags.push(qName);
}
}
不像是继承过来的方法?
package SAX;import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*; public class MyXMLReader extends DefaultHandler { java.util.Stack tags = new java.util.Stack();
public MyXMLReader() {
super();
} public static void main(String args[]) {
long lasting = System.currentTimeMillis();
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
MyXMLReader reader = new MyXMLReader();
sp.parse(new InputSource("data_10k.xml"), reader);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + " 毫秒");
} public void characters1(char ch[], int start, int length) throws SAXException {
System.out.println("characters()");
String tag = (String) tags.peek();
if (tag.equals("NO")) {
System.out.print("车牌号码:" + new String(ch, start, length));
}
if (tag.equals("ADDR")) {
System.out.println(" 地址:" + new String(ch, start, length));
}
} public void startElement(String uri,String localName,String qName,Attributes attrs)
{
System.out.println("startElement().qName:"+qName);
tags.push(qName);
}
}
<?xml version="1.0" encoding="GB2312"?>
<RESULT>
<VALUE>
<NO>A1234</NO>
<ADDR>四川省XX县XX镇XX路X段XX号</ADDR>
</VALUE>
<VALUE>
<NO>B1234</NO>
<ADDR>四川省XX市XX乡XX村XX组</ADDR>
</VALUE>
</RESULT>
reader.setContentHandler(dh);
reader.setEntityResolver(dh);
reader.setErrorHandler(dh);
reader.setDTDHandler(dh);它们吗?
sp.parse(new InputSource("data_10k.xml"), reader),这个sp会一边解析XML,一边调用reader中的相应方法,如果reader一定会有characters和startElement方法的,否则根本不会编译过。如果只是你没有覆盖,那么也只是因为DefaultHandler中已经有默认实现罢了。XMLReader会有很多实现类包含dom4j xereces xalan之类,不知道你指哪个
sp.parse(inputsource, reader)的时候,SAXParser会根据InputSource开始读取XML文件,然后根据XML的内容调用reader中的方法,例如
<?xml version="1.0" encoding="GB2312"?>
<RESULT>
<VALUE>
<NO>A1234</NO>
sp就会分别调用
reader.startDocument()
reader.startElement("RESULT");
reader.startElement("VALUE");
reader.startElement("NO");
reader.character("A1234");
reader.endElement("NO");这个调用是由SAXParsr一边读取XML文件,一边判断应该调用reader中的哪个方法