一、saxtest.java
package com.test.saxtest;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import com.cisau.handler.SAXParserHandler;
public class SAXTest {
public static void main(String[] args) {
//1、创建SAXParserFactory对象
SAXParserFactory saxpf = SAXParserFactory.newInstance();
try {
//2、通过SAXParserFactory创建SAXParser的实例
SAXParser parser = saxpf.newSAXParser();
//3、创建SAXParserHandler对象
SAXParserHandler saxParserHandler = new SAXParserHandler();
parser.parse("books.xml", saxParserHandler);
}catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
}
二、SAXParserHandler.java
package com.cisau.handler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXParserHandler extends DefaultHandler {
int bookIndex = 0;
//******************************************************************************************
/**
* 遍历XML文件的--开始--标签
* 解析XML元素
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//调用DefaultHandler的startElement方法
super.startElement(uri, localName, qName, attributes);
if (qName.equals("book")) {
bookIndex ++ ;
System.out.println("=============开始遍历" + bookIndex + "本书的内容============");
//已知book标签中只有一个ID属性,根据属性名获取属性值
/* String value = attributes.getValue("id");
System.out.println("book标签中的属性值是:" + value);*/
//不知道book标签中的属性名和个数
int length = attributes.getLength();
for (int i = 0; i < length; i++) {
System.out.print("book元素的第" + (i+1) + "个属性名是:" + attributes.getQName(i));
System.out.println("-----属性值是:" + attributes.getValue(i));
}
}
else if(!qName.equals("bookstore")){
System.out.print("节点名是:" + qName + "--------");
}
}
/**
* 遍历XML文件的--结束--标签
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
//调用DefaultHandler的startElement方法
super.endElement(uri, localName, qName);
if (qName.equals("book")) {
System.out.println("=============结束遍历" + bookIndex + "本书的内容============");
}
}
//***************************************标识开始解析***************************************************
/**
* 标识XML解析--开始
*/
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("解析:开始--");
}
/**
* 标识XML解析--结束
*/
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("解析:--结束");
}
//****************************************开始获取节点信息**************************************************
/**
* 获取整个文档中的所有内容---解析节点名+节点间文本
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
String value = new String(ch, start, length);
if (!value.trim().equals("")) {
System.out.println("节点值是:" + value);
}
}
}
三、books.xml
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>冰与火之歌</name>
<author>乔治马丁</author>
<year>2014</year>
<price>88</price>
</book>
<book>
<id>2</id>
<name>安徒生童话</name>
<author>丹麦</author>
<year>2004</year>
<price>66</price>
</book>
<book id="3" name="ha ">
<id><a>即使他---*</a>3</id>
<name>java开发</name>
<author>美国</author>
<year>2000</year>
<price>99</price>
</book>
</bookstore>