XML之SAX解析模型

DOM解析会把整个XML文件全部映射成Document里的树形结构,当遇到比较大的文件时,它的内存占用很大,查找很慢

SAX就是针对这种情况出现的解决方案,SAX解析器会从XML文件的起始位置起进行解析,同时根据已经定义好的事件处理器,来决定当前所解析的部分是否有必要进行记录并存储

import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
 
public class SaxParser{
public static void main(){
      File xmlFile = new File("E:\\article.xml");
      SAXParserFactory factory = SAXParserFactory.newInstance();
      try{
             SAXParser parser = factory.newSAXParser();
             parser.parse(xmlFile,newMySaxHandler());
      }catch(Exception e){
             e.printstacktrace();
      }
}
}
 
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MySaxHandler extends DefaultHandler{
      static DateFormat formater = newSimpleDateFormat("yyyy-MM-dd");
      private String content;
 
//覆写DefaultHandler中的charaters方法,接收元素中字符数据的通知,在执行完startElement或endElement方法后都会执行此操作
      @Override
      publicvoid charaters(char[] ch, int start, int length) throws SAXException{
             content = newString(ch,start,length);
      }
//当解析到元素的结束标签时触发
      @Override
      publicvoid endElement(String uri,String localName, String qName) throws SAXException{
      if("title".equals(qName))
             System.out.println("标题:"+ content);
      else if("author".equals(qName))
             System.out.println("作者:"+ content);
      else if("email".equals(qName))
             System.out.println("电子邮件:"+ content);
      else if("date".equals(qName))
             System.out.println("日期:"+ content);
      }
//当解析到元素的开始标签时触发
      @Override
      publicvoid startElement(String uri,String localName, String qName Attitudesattributes) throws SAXException{
             if("article".equals(qName)){
             System.out.println("所属分类:"+ attributes.getValue("category"));
             }
      }
}

 

DefaultHandler类

在解析XML数据时,要创建一个解析时的监听对象,一般可通过继承DefaultHandler类实现

void characters(char[] ch, int start, int length)

          接收元素中字符数据的通知。

 void endDocument()

          接收文档结束的通知。

 void endElement(String uri, String localName,String qName)

          接收元素结束的通知。

 void endPrefixMapping(String prefix)

          接收名称空间映射结束的通知。

 void error(SAXParseException e)

          接收可恢复的解析器错误的通知。

 void fatalError(SAXParseException e)

          报告严重的 XML 解析错误。

 void ignorableWhitespace(char[] ch, int start,int length)

          接收元素内容中可忽略空白的通知。

 void notationDecl(String name, StringpublicId, String systemId)

          接收注释声明的通知。

 void processingInstruction(String target,String data)

          接收处理指令的通知。

 InputSource resolveEntity(String publicId,String systemId)

          解析外部实体。

 void setDocumentLocator(Locator locator)

          接收文档事件的 Locator 对象。

 void skippedEntity(String name)

          接收跳过的实体的通知。

 void startDocument()

          接收文档开始的通知。

 void startElement(String uri, StringlocalName, String qName, Attributes attributes)

          接收元素开始的通知。

      uri - 名称空间 URI,如果元素没有任何名称空间URI,或者没有正在执行名称空间处理,则为空字符串。

      localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。

      qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。

      attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。

 void startPrefixMapping(String prefix, Stringuri)

          接收名称空间映射开始的通知。

 void unparsedEntityDecl(String name, StringpublicId, String systemId, String notationName)

          接收未解析实体声明的通知。

 void warning(SAXParseException e)

          接收解析器警告的通知。

Attributes

int getIndex(String qName)

          通过 XML 限定(前缀)名查找属性的索引。

 int getIndex(String uri, String localName)

          通过名称空间的名称查找属性的索引。

 int getLength()

          返回此列表中的属性个数。

 String getLocalName(int index)

          通过索引查找属性的本地名称。

 String getQName(int index)

          通过索引查找属性的 XML 限定(前缀)名。

 String getType(int index)

          通过索引查找属性的类型。

 String getType(String qName)

          通过 XML 限定(前缀)名查找属性的类型。

 String getType(String uri, String localName)

          根据名称空间的名称查找属性的类型。

 String getURI(int index)

          通过索引查找属性的名称空间 URI。

 String getValue(int index)

          通过索引查找属性的值。

 String getValue(String qName)

          通过 XML 限定(前缀)名查找属性的值。

 String getValue(String uri, String localName)

          根据名称空间的名称查找属性的值。

转载于:https://www.cnblogs.com/duadu/p/6335866.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值