使用JAXP进行sax解析

  1 package cn.liuning.sax;
  2 
  3 import javax.xml.parsers.SAXParser;
  4 import javax.xml.parsers.SAXParserFactory;
  5 
  6 import org.xml.sax.Attributes;
  7 import org.xml.sax.ContentHandler;
  8 import org.xml.sax.Locator;
  9 import org.xml.sax.SAXException;
 10 import org.xml.sax.XMLReader;
 11 import org.xml.sax.helpers.DefaultHandler;
 12 
 13 public class Demo1
 14 {
 15     /*
 16      * sax解析xml文档
 17      */
 18     public static void main(String[] args) throws Exception {
 19         //1.创建解析工厂
 20         SAXParserFactory factory = SAXParserFactory.newInstance();
 21         
 22         //2.得到解析器
 23         SAXParser sp = factory.newSAXParser();
 24         
 25         //3.得到读取器
 26         XMLReader reader = sp.getXMLReader();
 27         
 28         //4.设置内容处理器
 29         reader.setContentHandler(new TagValueHandler());
 30         
 31         //5.读取xm文档内容
 32         reader.parse("src/book.xml");    
 33     }
 34 }
 35 //得到xml文档的所有内容,实现接口ContentHandler
 36 class ListHandler implements ContentHandler
 37 {
 38     @Override
 39     public void setDocumentLocator(Locator locator) {
 40         // TODO 自动生成的方法存根        
 41     }
 42     @Override
 43     public void startDocument() throws SAXException {
 44         // TODO 自动生成的方法存根        
 45     }
 46     @Override
 47     public void endDocument() throws SAXException {
 48         // TODO 自动生成的方法存根        
 49     }
 50     @Override
 51     public void startPrefixMapping(String prefix, String uri)
 52             throws SAXException {
 53         // TODO 自动生成的方法存根        
 54     }
 55     @Override
 56     public void endPrefixMapping(String prefix) throws SAXException {
 57         // TODO 自动生成的方法存根        
 58     }
 59     @Override//开始标签
 60     public void startElement(String uri, String localName, String qName,
 61             Attributes atts) throws SAXException {
 62         System.out.println("<" + qName + ">");
 63         //获取标签属性
 64         for(int i=0;atts != null & i<atts.getLength();i++) //null
 65         {
 66             String attName = atts.getQName(i);
 67             String attValue = atts.getValue(i);
 68             
 69             System.out.println(attName + "=" + attValue);
 70         }        
 71     }
 72     @Override//结束标签
 73     public void endElement(String uri, String localName, String qName)
 74             throws SAXException {
 75         System.out.println("<" + qName +">");        
 76     }
 77     @Override//内容
 78     public void characters(char[] ch, int start, int length)
 79             throws SAXException {
 80         System.out.println(new String(ch,start,length));    
 81     }
 82     @Override
 83     public void ignorableWhitespace(char[] ch, int start, int length)
 84             throws SAXException {    
 85     }
 86     @Override
 87     public void processingInstruction(String target, String data)
 88             throws SAXException {
 89         // TODO 自动生成的方法存根        
 90     }
 91     @Override
 92     public void skippedEntity(String name) throws SAXException {
 93         // TODO 自动生成的方法存根        
 94     }    
 95 }
 96 //不实现ContentHandler接口,因为里面有很多用不到的方法,sun公司已经写了缺省的是吸纳类
 97 //阿么我只要继承然后写自己需要的方法就可以了。右键点击源码-覆盖实现方法
 98 
 99 //获取指定标签的值
100 class TagValueHandler extends DefaultHandler{
101     
102     private String currentTag;  //记住当前解析到的是什么标签
103     private int needNumber = 1;       //记住想获取第几个作者标签的值
104     private int currnetnumber=0;//当前解析到的是第几个
105 
106     @Override
107     public void startElement(String uri, String localName, String qName,
108             Attributes attributes) throws SAXException {
109         
110         currentTag = qName;
111         if(currentTag.equals("CreateTime")){
112             currnetnumber++;
113         }
114     }
115     @Override
116     public void endElement(String uri, String localName, String qName)
117             throws SAXException {
118         currentTag = null;
119     }
120     @Override
121     public void characters(char[] ch, int start, int length)
122             throws SAXException {
123         
124         if("CreateTime".equals(currentTag) && currnetnumber==needNumber){
125             System.out.println(new String(ch,start,length));
126         }
127     }
128 }

 

posted on 2014-07-09 18:50  随风浪子的博客  阅读(329)  评论(0编辑  收藏  举报

导航