新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论DOM, SAX, XPath等。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 DOM/SAX/XPath 』 → sax新手,一个简单的问题 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 16588 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: sax新手,一个简单的问题 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     0messiah 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:59
      门派:XML.ORG.CN
      注册:2006/5/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给0messiah发送一个短消息 把0messiah加入好友 查看0messiah的个人资料 搜索0messiah在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看0messiah的博客楼主
    发贴心情 sax新手,一个简单的问题

    package xmlsax;

    import java.io.File;
    import java.io.IOException;
    import java.util.*;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;

    /**
    *
    * @author Administrator
    */
    public class XMLParser extends DefaultHandler{
        Stack tags;
        int count;
        
        private static String sex;
        
        private String name;
        
        private String brith;
        
        private String pro;
        
        private String grade;
        
        private String classname;
        
        private String ElementName;
        
        private String proat;
        
        /** Creates a new instance of XMLParser */
        public XMLParser() {
            count = 0;
        }
        public void characters(char[] ch,int start,int length) {
            String tagBodyText=new String(ch,start,length);  //获得标签体的文字串内容
    /*
            下列的代码主要是识别是否是指定的名称的标签,如果是并且识别其标签体是否为空,最后获得标签体的文字串
    */
            
            if(this.ElementName.equals("姓名") && tagBodyText.equals("张三")) {
                this.name=tagBodyText;
            }
            if(this.ElementName.equals("出生日期")&& !tagBodyText.trim().equals("")) {
                this.brith=tagBodyText;
            }
            if(this.ElementName.equals("专业")&& !tagBodyText.trim().equals("")) {
                this.pro=tagBodyText;
            }
            if(this.ElementName.equals("年级") && !tagBodyText.trim().equals("")) {
                this.grade=tagBodyText;
            }
            if(this.ElementName.equals("班级") && !tagBodyText.trim().equals("")) {
                this.classname=tagBodyText;
            }
            
            
        }
        public void startDocument(){
            tags = new Stack();
            //count = 0;
        }
        public void endDocument(){
            System.out.println("总共有"+count+"个学生");
            System.out.println("姓名:"+name);
            System.out.println("性别:"+sex);
            System.out.println("出生日期:"+brith);
            System.out.println("专业:"+this.pro);
            System.out.println("年级:"+grade);
            System.out.println("班级:"+classname);
            System.out.println("方向:"+this.proat);
        }
        public void startElement(String namespaceURI, String localName, String qName, Attributes atts){
            tags.push(qName);
            if (qName.equals("学生信息")){
                count++;
                this.sex = atts.getValue(0);}this.ElementName=qName;        this.proat = atts.getValue(0);
        }
        public void endElement(String namespaceURI,String localName,String qName) throws SAXException {
            tags.pop();     //从Stack中获得标签的名称字符串
        }
        public static void main(String[] args){
            String filename = "student.xml";
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser saxparser = null;
            try {
                saxparser = spf.newSAXParser();
            } catch (ParserConfigurationException ex) {
                ex.printStackTrace();
            } catch (SAXException ex) {
                ex.printStackTrace();
            }
            try {
                saxparser.parse(new File(filename),new XMLParser());
            } catch (SAXException ex) {
                ex.printStackTrace();
                System.exit(1);
            } catch (IOException ex) {
                ex.printStackTrace();
                System.exit(1);
            }
        }
    }
    student.xml
    <?xml version="1.0" encoding="GB2312" standalone="yes" ?>
    <软件学院学生信息>
     <学生信息 性别="男">
      <姓名>张三</姓名>
      <出生日期>1987/10/18</出生日期>
      <专业>软件工程</专业>
      <年级>3</年级>
    <班级 方向="J2EE软件开发">软件1班</班级>
     </学生信息>
     <学生信息 性别="女">
      <姓名>李四</姓名>
      <出生日期>1988/2/18</出生日期>
      <专业>软件工程</专业>
      <年级>3</年级>
      <班级 方向="数字媒体方向">软件2班</班级>
     </学生信息>
    </软件学院学生信息>

    解析结果不对……


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/11/2 0:02:00
     
     fangel2000 帅哥哟,离线,有人找我吗?
      
      
      头衔:w3china第一水王
      等级:大四寒假(收到Microsoft的Offer啦)
      文章:283
      积分:1503
      门派:W3CHINA.ORG
      注册:2006/5/30

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给fangel2000发送一个短消息 把fangel2000加入好友 查看fangel2000的个人资料 搜索fangel2000在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看fangel2000的博客2
    发贴心情 
    额,这个问题等会回来看看,有挑战性
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/11/5 14:47:00
     
     fangel2000 帅哥哟,离线,有人找我吗?
      
      
      头衔:w3china第一水王
      等级:大四寒假(收到Microsoft的Offer啦)
      文章:283
      积分:1503
      门派:W3CHINA.ORG
      注册:2006/5/30

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给fangel2000发送一个短消息 把fangel2000加入好友 查看fangel2000的个人资料 搜索fangel2000在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看fangel2000的博客3
    发贴心情 
    不正确的原因主要是因为
            if(this.ElementName.equals("姓名") && tagBodyText.equals("张三")) {
                this.name=tagBodyText;
            }
    再者你的输出只有一个,是因为你将输入写到了public void endDocument()函数中,在结束整个文档的时候才调用这个函数的。所以只会显示最后一个学生的信息
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/11/5 15:07:00
     
     fangel2000 帅哥哟,离线,有人找我吗?
      
      
      头衔:w3china第一水王
      等级:大四寒假(收到Microsoft的Offer啦)
      文章:283
      积分:1503
      门派:W3CHINA.ORG
      注册:2006/5/30

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给fangel2000发送一个短消息 把fangel2000加入好友 查看fangel2000的个人资料 搜索fangel2000在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看fangel2000的博客4
    发贴心情 
    修改后的代码如下所示:


    import java.io.File;
    import java.io.IOException;
    import java.util.*;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;

    /**
    *
    * @author Administrator
    */
    public class XMLParser extends DefaultHandler{
        Stack tags;
        int count;
        
        private static String sex;
        
        private String name;
        
        private String brith;
        
        private String pro;
        
        private String grade;
        
        private String classname;
        
        private String ElementName;
        
        private String proat;
        
        /** Creates a new instance of XMLParser */
        public XMLParser() {
            count = 0;
        }
        public void characters(char[] ch,int start,int length) {
            String tagBodyText=new String(ch,start,length);  //获得标签体的文字串内容
    /*
            下列的代码主要是识别是否是指定的名称的标签,如果是并且识别其标签体是否为空,最后获得标签体的文字串
    */
       
            if(this.ElementName.equals("姓名") && !tagBodyText.trim().equals("")) {
                this.name=tagBodyText;
            }
            if(this.ElementName.equals("出生日期")&& !tagBodyText.trim().equals("")) {
                this.brith=tagBodyText;
            }
            if(this.ElementName.equals("专业")&& !tagBodyText.trim().equals("")) {
                this.pro=tagBodyText;
            }
            if(this.ElementName.equals("年级") && !tagBodyText.trim().equals("")) {
                this.grade=tagBodyText;
            }
            if(this.ElementName.equals("班级") && !tagBodyText.trim().equals("")) {
                this.classname=tagBodyText;
            }
                    
        }
        public void startDocument(){
            tags = new Stack();
            //count = 0;
        }
        public void endDocument(){
            System.out.println("总共有"+count+"个学生");
            
        }
        public void startElement(String namespaceURI, String localName, String qName, Attributes atts){
            tags.push(qName);
            if (qName.equals("学生信息")){
                count++;
                this.sex = atts.getValue(0);
             }
            this.ElementName=qName;        
            this.proat = atts.getValue(0);
        }
        public void endElement(String namespaceURI,String localName,String qName) throws SAXException {
            String s = tags.pop().toString();
         if(s.equals("姓名"))     //从Stack中获得标签的名称字符串
         {
             System.out.println("姓名:"+name);
             System.out.println("性别:"+sex);
         }
         else if(s.equals("出生日期"))
             System.out.println("出生日期:"+brith);
         else if(s.equals("专业"))
             System.out.println("专业:"+this.pro);
         else if(s.equals("年级"))
             System.out.println("年级:"+grade);
         else if(s.equals("班级"))
         {
             System.out.println("班级:"+classname);
             System.out.println("方向:"+this.proat);
             System.out.println("-------------------------------");
         }
        }
        public static void main(String[] args){
            String filename = "student.xml";
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser saxparser = null;
            try {
                saxparser = spf.newSAXParser();
            } catch (ParserConfigurationException ex) {
                ex.printStackTrace();
            } catch (SAXException ex) {
                ex.printStackTrace();
            }
            try {
                saxparser.parse(new File(filename),new XMLParser());
            } catch (SAXException ex) {
                ex.printStackTrace();
                System.exit(1);
            } catch (IOException ex) {
                ex.printStackTrace();
                System.exit(1);
            }
        }
    }

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/11/5 15:08:00
     
     0messiah 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:59
      门派:XML.ORG.CN
      注册:2006/5/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给0messiah发送一个短消息 把0messiah加入好友 查看0messiah的个人资料 搜索0messiah在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看0messiah的博客5
    发贴心情 
    谢谢楼上的了,sax确实比dom难以理解一些。
    马上要学ajax了,不知道是不是更难一些。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/11/8 0:05:00
     
     fangel2000 帅哥哟,离线,有人找我吗?
      
      
      头衔:w3china第一水王
      等级:大四寒假(收到Microsoft的Offer啦)
      文章:283
      积分:1503
      门派:W3CHINA.ORG
      注册:2006/5/30

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给fangel2000发送一个短消息 把fangel2000加入好友 查看fangel2000的个人资料 搜索fangel2000在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看fangel2000的博客6
    发贴心情 
    sax我感觉还好吧,不就是几个触发事件么,遇到元素开始和结束,都会触发startelemnet和endelement事件
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/11/8 14:58:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 DOM/SAX/XPath 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/18 8:58:00

    本主题贴数6,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    109.375ms