XML之SAX解析模型

前端之家收集整理的这篇文章主要介绍了XML之SAX解析模型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_1@DOM解析会把整个XML文件全部映射成Document里的树形结构,当遇到比较大的文件时,它的内存占用很大,查找很慢

@H_301_1@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 qName Attitudesattributes) throws SAXException{
             if("article".equals(qName)){
             System.out.println("所属分类:"+ attributes.getValue("category"));
             }
      }
}

DefaultHandler类

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

@H_301_1@void characters(char[] ch,int length)

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

@H_301_1@void endDocument()

@H_301_1@ 接收文档结束的通知

@H_301_1@void endElement(String uri,String qName)

@H_301_1@ 接收元素结束的通知

@H_301_1@void endPrefixMapping(String prefix)

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

@H_301_1@void error(SAXParseException e)

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

@H_301_1@void fatalError(SAXParseException e)

@H_301_1@ 报告严重的 XML 解析错误

@H_301_1@void ignorableWhitespace(char[] ch,int length)

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

@H_301_1@void notationDecl(String name,StringpublicId,String systemId)

@H_301_1@ 接收注释声明的通知

@H_301_1@void processingInstruction(String target,String data)

@H_301_1@ 接收处理指令的通知

@H_301_1@InputSource resolveEntity(String publicId,String systemId)

@H_301_1@ 解析外部实体。

@H_301_1@void setDocumentLocator(Locator locator)

@H_301_1@ 接收文档事件的 Locator 对象。

@H_301_1@void skippedEntity(String name)

@H_301_1@ 接收跳过的实体的通知

@H_301_1@void startDocument()

@H_301_1@ 接收文档开始的通知

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

@H_301_1@ 接收元素开始的通知

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

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

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

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

@H_301_1@void startPrefixMapping(String prefix,Stringuri)

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

@H_301_1@void unparsedEntityDecl(String name,String systemId,String notationName)

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

@H_301_1@void warning(SAXParseException e)

@H_301_1@ 接收解析器警告的通知

Attributes

@H_301_1@int getIndex(String qName)

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

@H_301_1@int getIndex(String uri,String localName)

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

@H_301_1@int getLength()

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

@H_301_1@String getLocalName(int index)

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

@H_301_1@String getQName(int index)

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

@H_301_1@String getType(int index)

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

@H_301_1@String getType(String qName)

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

@H_301_1@String getType(String uri,String localName)

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

@H_301_1@String getURI(int index)

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

@H_301_1@String getValue(int index)

@H_301_1@ 通过索引查找属性的值。

@H_301_1@String getValue(String qName)

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

@H_301_1@String getValue(String uri,String localName)

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

原文链接:/xml/297351.html

猜你在找的XML相关文章