SAX解析XML文件

java项目文件

 

[java][/java] view plaincopy

  1. package sax;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import javax.xml.parsers.ParserConfigurationException;
  5. import javax.xml.parsers.SAXParser;
  6. import javax.xml.parsers.SAXParserFactory;
  7. import org.junit.Test;
  8. import org.xml.sax.Attributes;
  9. import org.xml.sax.SAXException;
  10. import org.xml.sax.helpers.DefaultHandler;
  11. public class SaxTest {
  12.     @Test
  13.     public void test() throws ParserConfigurationException, SAXException,
  14.             IOException {
  15.         // 创建定义工厂 API,使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档。
  16.         // 使用SAXParserFactory创建SAX解析工厂
  17.         SAXParserFactory spf = SAXParserFactory.newInstance();
  18.         // 通过SAX解析工厂得到解析器对象
  19.         SAXParser sp = spf.newSAXParser();
  20.         // parse(File f, DefaultHandler dh)使用指定的 DefaultHandler(缺省处理程序)
  21.         // 将指定文件的内容解析为 XML。
  22.         sp.parse(new File(“src//sax//sida.xml”), new MyDefaultHandler());
  23.     }
  24.     // 创建内部类,继承DefaultHandler(缺省处理程序)并重写程序执行中用到的方法
  25.     class MyDefaultHandler extends DefaultHandler {
  26.         // 定义开关,用来开启一些方法
  27.         boolean flag = false;
  28.         @Override
  29.         // 重写文档的开始方法,这个方法在装载文档的时候会首先执行
  30.         public void startDocument() throws SAXException {
  31.             // TODO Auto-generated method stub
  32.             super.startDocument();
  33.             System.out.println(“startDocument”);
  34.         }
  35.         @Override
  36.         // 重写接收元素开始的通知。 ,当解析出来元素时会调用这个方法
  37.         // uri – 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
  38.         // localName – 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
  39.         // qName – 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
  40.         // attributes – 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
  41.         public void startElement(String uri, String localName, String qName,
  42.                 Attributes attributes) throws SAXException {
  43.             // TODO Auto-generated method stub
  44.             super.startElement(uri, localName, qName, attributes);
  45.             // 创建约束条件,只有符合约束的元素才会进入方法,
  46.             // qName应该是元素对象的名称
  47.             if (“作者”.equals(qName)) {
  48.                 flag = true;
  49.                 System.out.println(“startElement”);
  50.             }
  51.         }
  52.         @Override
  53.         // 接收元素中字符数据的通知。
  54.         public void characters(char[] ch, int start, int length)
  55.                 throws SAXException {
  56.             // TODO Auto-generated method stub
  57.             super.characters(ch, start, length);
  58.             // 首先判断控制开关是否打开
  59.             if (flag) {
  60.                 // 输出元素对象,即两个标签之间所标注的文本内容(相当于DOM解析中的getNodeValue();操作)
  61.                 System.out.println(new String(ch, start, length));
  62.             }
  63.         }
  64.         @Override
  65.         // 接收元素结束的通知。
  66.         public void endElement(String uri, String localName, String qName)
  67.                 throws SAXException {
  68.             // TODO Auto-generated method stub
  69.             super.endElement(uri, localName, qName);
  70.             // 判断操作的标签对象是否符合规范
  71.             if (“作者”.equals(qName)) {
  72.                 System.out.println(“endElement”);
  73.                 // 关闭方法开关
  74.                 flag = false;
  75.             }
  76.         }
  77.         @Override
  78.         // 接收文档结束的通知。
  79.         public void endDocument() throws SAXException {
  80.             // TODO Auto-generated method stub
  81.             super.endDocument();
  82.             //当文档加载完毕时操作此方法
  83.             System.out.println(“endDocument”);
  84.         }
  85.     }
  86. }

XML文件

 

 

[html][/html] view plaincopy

  1. <!DOCTYPE 四大名著[
  2. <!ELEMENT 四大名著 (西游记,红楼梦)>
  3. <!ATTLIST 西游记 id ID #IMPLIED>
  4. ]>
  5. <四大名著>
  6.     <西游记 id=”x001″>
  7.         <作者>吴承恩</作者>
  8.     </西游记>
  9.     <红楼梦 id=”x002″>
  10.         <作者>曹雪芹</作者>
  11.     </红楼梦>
  12. </四大名著>

标签