为生存而奔跑

   :: 首页 :: 联系 :: 聚合  :: 管理
  271 Posts :: 0 Stories :: 58 Comments :: 0 Trackbacks

留言簿(5)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 287148
  • 排名 - 78

最新评论

阅读排行榜

评论排行榜

SAX采用的是事件驱动模型。需要先定义一些方法,解析器解析时,当触发事件时,会自动调用响应的已经定义好的方法。一般要重写的方法有:
Start document   //开始解析时的事件
startElement(String uri, String localName, String qName, Attributes attr)  //遇到一个元素的开始时的事件
characters( char[] chars, int start, int length ) //遇到的文本。start表示文本在数组chars中的开始位置,length表示文本的长度
endElement(String uri, String localName, String qName) //遇到元素结束标记时的事件


对于下面的XML

<?xml version="1.0" encoding="gb2312"?>
<student>
    
<person age="25"><!--如果没有age属性,默认的为20-->
        
<name>崔卫兵</name>
        
<college>PC学院</college>
        
<telephone>62354666</telephone>
        
<notes>男,1982年生,硕士,现就读于北京邮电大学</notes>
    
</person>
    
<person>
        
<name>cwb</name>
        
<college leader="leader1">PC学院</college><!--如果没有leader属性,默
认的为leader
-->
        
<telephone>62358888</telephone>
        
<notes>男,1987年生,硕士,现就读于中国农业大学</notes>
    
</person>
    
<person age="45">
        
<name>xxxxx</name>
        
<college leader="学院领导">xxx学院</college>
        
<telephone>66666666</telephone>
        
<notes>注视中,注释中</notes>
    
</person>
</student>

通过下面的程序解析后,可以把每个标签中的内容提取出

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;

import java.io.*;

public class TestSAX extends DefaultHandler{

    
public TestSAX(){
        
super();
    }

    
    
public void startElement(String uri, String localName, String qName, Attributes atts)throws SAXException{
        
/*if(qName.equalsIgnoreCase("person")){
            String age=atts.getValue("age");
            if(age!=null)
                System.out.println("age: "+age);
            else System.out.println("age: 20");
        }
        else if(qName.equalsIgnoreCase("name")){
            tagName="name";
        }
        else if(qName.equalsIgnoreCase("college")){
            tagName="college";
        }
        else if(qName.equalsIgnoreCase("telephone")){
            tagName="telephone";
        }
        else if(qName.equalsIgnoreCase("notes")){
            tagName="notes";
        }
*/

        
if("person".equals(qName)){
            String age
=atts.getValue("age");
            
if(age!=null)
                System.out.println(
"age: "+age);
            
else System.out.println("age: 20");
        }

        
if("name".equals(qName) || "college".equals(qName) || "telephone".equals(qName) || "notes".equals(qName))
            tagName
=qName;
        
    }

    
    
public void characters(char[] ch, int start, int length)throws SAXException{
        String text
=new String(ch,start,length);
        
/*if(tagName.equals("name")) System.out.println("name: "+text);
        else if(tagName.equals("college")) System.out.println("college: "+text);
        else if(tagName.equals("telephone")) System.out.println("telephone: "+text);
        else if(tagName.equals("notes")) System.out.println("notes: "+text);
*/

        
        
if("name".equals(tagName)){
            System.out.println(
"name: "+text);
        }

        
else if("college".equals(tagName)){
            System.out.println(
"college: "+text);
        }

        
else if("telephone".equals(tagName)){
            System.out.println(
"telephone: "+text);
        }

        
else if("notes".equals(tagName)){
            System.out.println(
"notes: "+text);
        }

        tagName
=null;
    }

    
    
private String tagName=null;
    
    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        try{
            TestSAX testSAX
=new TestSAX();
            SAXParserFactory factory
=SAXParserFactory.newInstance();
            SAXParser parser
=factory.newSAXParser();
            parser.parse(
new File("E:/我的文档/tmp/test.xml"), testSAX);
        }

        
catch(IOException e){
            e.printStackTrace(); 
        }
catch(SAXException e){
            e.printStackTrace(); 
        }
catch(Exception e){
            e.printStackTrace(); 
        }

    }


}



注意程序中注释的内容,它本来与外面的代码按说是等价的,但是如果用注释里面的代码就会出错。或许是因为当参数为null时,也会触发startElement和characters事件,这样,在空的string对象上调用equals就会出错

posted on 2010-04-21 19:49 baby-fly 阅读(546) 评论(0)  编辑 收藏 引用 所属分类: Java

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理