Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 300|回复: 0

[xml学习]java sax解析xml文档

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-10 01:00:20 | 显示全部楼层 |阅读模式
    java的sax解析是基于事件的解析:当解析到xml的某个部分的时候,会触发特定事件,可以在自定义的解析类中定义当事件触发时要做得事情。     我们可以继承org.xml.sax.helpers.DefaultHandler类(该类是org.xml.sax.helpers.ContentHandler的接口实现类)来覆盖ContentHandler接口的各种方法,这些方法将定义各个事件所触发的程序动作。 package com.thomas.xml.sax;
    import org.xml.sax.Attributes;
    import org.xml.sax.Locator;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler; public class ThomasSAXHandler extends DefaultHandler {
      
      private StringBuffer xml;//格式化后的XML文件内容
      private static int step = 0;//元素层次
      
      public ThomasSAXHandler(){
       this.xml = new StringBuffer();
      }
      
      public StringBuffer getXml() {
       return xml;
      }
      public void setXml(StringBuffer xml) {
       this.xml = xml;
      }
      /**
        * 给字符串添加TAB,使其能格式化输出,在这里第step层元素缩进step个Tab
        */
      private void appendTab(){
       for(int i = 1 ; i<step; i++){
        for(int j = 0 ;j<4; j++){
         xml.append(" ");
        }
       }
      }
      /**
        * 接收元素中字符数据的通知。
        * @param ch - 字符。
        * @param start - 字符数组中的开始位置。
        * @param length - 从字符数组中使用的字符数。
        */
      public void characters(char[] ch, int start, int length) throws SAXException {
       String text = new String(ch,start,length);
       text = text.trim();
       if(!text.equals("")){
           step++;
           appendTab();
           xml.append(text).append("
    ");
           step--;
          }
      }
      /**
       * 接收文档的结尾的通知。
       * @exception SAXException - 任何 SAX 异常,可能包装另外的异常。
       */
      public void endDocument() throws SAXException {
       // TODO Auto-generated method stub  }
      /**
         * 接收元素结束的通知   
         * @param uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
         * @param localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
         * @param qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
         * @exception SAXException - 任何 SAX 异常,可能包装另外的异常。
         */
      public void endElement(String uri, String localName, String qName) throws SAXException {
       appendTab();
       xml.append("</");
       if(!uri.equals("")){
        xml.append(uri+":");
       }
       xml.append(qName).append(">
    ");
       step--;  }
      /**
       * 结束前缀 URI 范围的映射。
       * @param prefix - 被映射的前缀。当默认的映射范围结束时,这是一个空字符串。
       * @exception SAXException - 客户端可能会在处理期间抛出一个异常
       */
      public void endPrefixMapping(String prefix) throws SAXException {
       // TODO Auto-generated method stub  }
      /**
       * 接收元素内容中可忽略的空白的通知。
       * @param ch 来自 XML 文档的字符
       * @param start 数组中的开始位置
       * @param length 从数组中读取的字符的个数
       * @exception SAXException - 任何 SAX 异常,可能包装另外的异常
       */
      public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
       // TODO Auto-generated method stub  }
      /**
       * 接收处理指令的通知。
       * @param target 处理指令目标
       * @param data 处理指令数据,如果未提供,则为 null。该数据不包括将其与目标分开的任何空白
       */
      public void processingInstruction(String target, String data) throws SAXException {
       // TODO Auto-generated method stub  }
      /**
       * 接收用来查找 SAX 文档事件起源的对象
       * @param locator 可以返回任何 SAX 文档事件位置的对象
       */
      public void setDocumentLocator(Locator locator) {
       // TODO Auto-generated method stub  }
      /**
       * 接收跳过的实体的通知。将不为标记结构(如元素开始标记或标记声明)内的实体引用调用此方法。(XML 建议书要求报告所跳过的外部实体。SAX 还报告内部实体扩展 / 非扩展,但不包括在标记结构内部。)
       * @param name - 所跳过的实体的名称。如果它是参数实体,则名称将以 "%" 开头,如果它是外部 DTD 子集,则将是字符串 "[dtd]"
       * @exception SAXException - 任何 SAX 异常,可能包装另外的异常
       */
      public void skippedEntity(String name) throws SAXException {
       // TODO Auto-generated method stub  }
      /**
       * 接收文档的开始的通知
       * @exception - SAXException - 任何 SAX 异常,可能包装另外的异常
       */
      public void startDocument() throws SAXException {
       // TODO Auto-generated method stub  }
      /**
        * 接收元素开始的通知。
        * @param uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
        * @param localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
        * @param qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
        * @param attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
        * @exception SAXException - 任何 SAX 异常,可能包装另外的异常
        */
      public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
       step++;//元素层次加一
       appendTab();
       xml.append("<");
       if(!uri.equals("")){
        xml.append(uri+":");
       }
       xml.append(qName);
       for(int i = 0, size = attributes.getLength(); i<size; i++){
           xml.append(" ").append(attributes.getQName(i)).append("="").append(attributes.getValue(i)).append(""");
       }
       xml.append(">
    ");
      }
      /**
       * 开始前缀 URI 名称空间范围映射。
       * @param prefix - 声明的名称空间前缀。对于没有前缀的默认元素名称空间,使用空字符串。
       * @param uri - 将前缀映射到的名称空间 URI
       * @exception - SAXException - 客户端可能会在处理期间抛出一个异常
       */
      public void startPrefixMapping(String prefix, String uri) throws SAXException {
       // TODO Auto-generated method stub  } }       上面是我们自定义的解析器,可以在带有main方法的类中加以测试 package com.thomas.xml.sax; import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    import org.xml.sax.InputSource;
    public class Test {
      public static void main(String[] args){
         try{   
             SAXParserFactory sf  = SAXParserFactory.newInstance();
             SAXParser sp = sf.newSAXParser();
             ThomasSAXHandler handler = new ThomasSAXHandler();
             sp.parse(new InputSource("film.xml"),handler);
             System.out.println(handler.getXml());
         }
         catch(Exception e){
          e.printStackTrace();
         }
        }
    }
    下面是film.xml <?xml version="1.0" encoding="gb2312"?>
    <Kungfu-vips>
    <vip>
        <name lang="en,ch">Bruce Li</name>
        <age>32</age>
        <sex>male</sex>
    </vip>
    <vip>
        <name lang="en,ch">Jakie Chen</name>
        <age>39</age>
        <sex>male</sex>
    </vip>
    <vip>
        <name lang="en,ch">Jet Li</name>
        <age>39</age>
        <sex>male</sex>
    </vip>
    </Kungfu-vips> 运行test类,可以看到输出结果: <Kungfu-vips>
         <vip>
             <name lang="en,ch">
                 Bruce Li
             </name>
             <age>
                 32
             </age>
             <sex>
                 male
             </sex>
         </vip>
         <vip>
             <name lang="en,ch">
                 Jakie Chen
             </name>
             <age>
                 39
             </age>
             <sex>
                 male
             </sex>
         </vip>
         <vip>
             <name lang="en,ch">
                 Jet Li
             </name>
             <age>
                 39
             </age>
             <sex>
                 male
             </sex>
         </vip>
    </Kungfu-vips>  

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/10/10/010020062.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 17:49 , Processed in 0.365147 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表