XML----SAX解析XML文件

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

[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. </四大名著>  
原创粉丝点击