SAX解析:
1.DOM解析XML文件时,需要先读取XML文档,在内存中构建Document对象,然后进行操作。当文档很大时,容易内存溢出。
SAX解析在读取文档时就会对文档进行处理,不需要全部装载完。
2.SAX解析一般步骤:
(1)创建解析工厂
(2)创建解析器
(3)获取XML读取器
(4)设置内容处理器
(5)解析XML文档
具体代码:
//SAX解析XML文档
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//创建解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//创建解析器
SAXParser parser = factory.newSAXParser();
//获取读取器
XMLReader reader = parser.getXMLReader();
//设置内容处理器
reader.setContentHandler(new linkedHandler());
//解析XML文档
reader.parse("src/book.xml");
}
3.内容处理器的设置
(1)解析所有内容(因为是实现,其他方法不变,就变下面几个方法)
class linkedHandler implements ContentHandler{
@Override
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
System.out.println("<"+qName+" ");
for(int i=0;i<atts.getLength();i++){
String name = atts.getQName(i);
String value = atts.getValue(i);
System.out.println(name + "=" + value);
}
System.out.println(" " + ">");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch,start,length));
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("</" + qName + ">");
}
}
(2)//查询特定标签下面的内容
class linkedHandler extends DefaultHandler{
private String currentTag;
private int needNumber = 2;
private int currentNumber;
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
currentTag = qName;
if(currentTag.equals("作者")){
currentNumber++;
}
}
public void characters(char[] ch, int start, int length)
throws SAXException {
if("作者".equals(currentTag)&& currentNumber==needNumber){
System.out.println(new String(ch,start,length));
}
}
}