- 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.junit.Test;
- import org.xml.sax.Attributes;
- import org.xml.sax.SAXException;
- import org.xml.sax.helpers.DefaultHandler;
- public class SaxTest {
- @Test
- public void test() throws ParserConfigurationException, SAXException,
- IOException {
- // 创建定义工厂 API,使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档。
- // 使用SAXParserFactory创建SAX解析工厂
- SAXParserFactory spf = SAXParserFactory.newInstance();
- // 通过SAX解析工厂得到解析器对象
- SAXParser sp = spf.newSAXParser();
- // parse(File f, DefaultHandler dh)使用指定的 DefaultHandler(缺省处理程序)
- // 将指定文件的内容解析为 XML。
- sp.parse(new File("src//sax//sida.xml"), new MyDefaultHandler());
- }
- // 创建内部类,继承DefaultHandler(缺省处理程序)并重写程序执行中用到的方法
- class MyDefaultHandler extends DefaultHandler {
- // 定义开关,用来开启一些方法
- boolean flag = false;
- @Override
- // 重写文档的开始方法,这个方法在装载文档的时候会首先执行
- public void startDocument() throws SAXException {
- // TODO Auto-generated method stub
- super.startDocument();
- System.out.println("startDocument");
- }
- @Override
- /* 重写接收元素开始的通知。 ,当解析出来元素时会调用这个方法
- uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
- localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
- qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
- attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。 */
- public void startElement(String uri, String localName, String qName,
- Attributes attributes) throws SAXException {
- // TODO Auto-generated method stub
- super.startElement(uri, localName, qName, attributes);
- // 创建约束条件,只有符合约束的元素才会进入方法,
- // qName应该是元素对象的名称
- if ("作者".equals(qName)) {
- flag = true;
- System.out.println("startElement");
- }
- }
- @Override
- // 接收元素中字符数据的通知。
- public void characters(char[] ch, int start, int length)
- throws SAXException {
- // TODO Auto-generated method stub
- super.characters(ch, start, length);
- // 首先判断控制开关是否打开
- if (flag) {
- // 输出元素对象,即两个标签之间所标注的文本内容(相当于DOM解析中的getNodeValue();操作)
- System.out.println(new String(ch, start, length));
- }
- }
- @Override
- // 接收元素结束的通知。
- public void endElement(String uri, String localName, String qName)
- throws SAXException {
- // TODO Auto-generated method stub
- super.endElement(uri, localName, qName);
- // 判断操作的标签对象是否符合规范
- if ("作者".equals(qName)) {
- System.out.println("endElement");
- // 关闭方法开关
- flag = false;
- }
- }
- @Override
- // 接收文档结束的通知。
- public void endDocument() throws SAXException {
- // TODO Auto-generated method stub
- super.endDocument();
- //当文档加载完毕时操作此方法
- System.out.println("endDocument");
- }
- }
- }
- <!DOCTYPE 四大名著[
- <!ELEMENT 四大名著 (西游记,红楼梦)>
- <!ATTLIST 西游记 id ID #IMPLIED>
- ]>
- <四大名著>
- <西游记 id="x001">
- <作者>吴承恩</作者>
- </西游记>
- <红楼梦 id="x002">
- <作者>曹雪芹</作者>
- </红楼梦>
- </四大名著>