SAX解析器是通过回调的方式来执行XML的解析工作的。对于基本的解析操作还是比较简单的,就是实现SAX2.0定义的四个核心接口,并注册进解析器即可。具体的操作都在四个接口中的回调方法中。所谓回调,我理解它与.Net中的事件类似。
这四个核心接口是为:
org.xml.sax.ContentHander
org.xml.sax.ErrorHandler
org.xml.sax.DTDHandler
org.xml.sax.EntityResolver
对应的注册进解析器的方法分别是
parser.setContentHandler(ContentHander handler)
parser.setErrorHandler(ErrorHandler handler)
parser.setDTDHandler(DTDHandler handler)
parser.setEntityResolver(EntityResolver handler)
分别看一下这几个核心接口中的回调方法:
1. ContentHandler
//除setDocumentLocator()外,其他回调方法均抛出SAXException。
public interface ContentHandler{
/*Locator中有用方法如getLineNumber(),getColumnNumber()等,所以可以考虑把locator作为ContentHandler实现类的实例变量,然后传播到其他回调方法。*/
public void setDocumentLocator(Locator locator);
/*startDocument()是开始解析后第一个被调用的方法,endDocument()是最后一个。回调方法没有参数可以使用。*/
public void startDocument();
public void endDocument();
/*当解析器到达前缀影射的开头和结尾时,分别回调这两个方法。如ora:copyright,其中ora为前缀(prefix), 整个ora:copyright为URI*/
public void startPrefixMapping(String prefix, String uri);
public void endPrefexMapping(String prefix);
/*当解析器到达一个Element和结束时,分别回调这两个方法。关于参数:namespaceURI,localName,qName表示Element名字的各个部分,atts表示该Element的所有属性的引用。*/
public void startElement(String namespaceURI,
String localName, String qName, Attribute atts);
public void endElement(String namespaceURI,
String localName, String qName);
/*对于<Book>XML Instroduction<Book>,当解析器解析完文本内容后,回调此方法。一般来说我们可以通过三个参数构造一个String对象来使用。如:
String text= new String(ch,start,length)*/
public void characters(char ch[], int start, int length);
/*忽略空白后回调此方法*/
public void ignorableWhitespace(char ch[],
int start, int length);
/*处理指令*/
public void processingInstruction(String target,String data);
/*一般不会用到,因为大部分解析器是不会跳过实体的。暂且不用管它*/
pubilc void skippedEntity(String name);
}
2. ErrorHandler
/*故名思义,解析过程中分别是出现警告,错误,致命错误时,回调这三个方法。SAXParserException中包含错误信息和行号。*/
public interface ErrorHandler{
public void warning(SAXParseException ex) throw SAXException;
public void error(SAXParseException ex) throw SAXException;
public void fatalError(SAXParseException ex) throw SAXException;
}
3. DTDHandler
基本用不上,不做详细讨论了。
public interface DTDHandler{
public void notationDecl(String name, String publicID,
String systemID) throw SAXException;
pulic void unparserdEntityDecl(String name, String publicID,
String systemID, String notationName)
throw SAXException
}
4. EntityResolver
用于解析实体的,只有一个回调方法。
public interface EntityResolver{
/*如果返回值是null,解析的执行过程就不会改变。否则将开始执行返回的被引用的内容XML。*/
public InputSource resolveEntity(String publicID,
String systemID) throw SAXException
}
解析编码例子:
String parserClass = "org.apache.xerces.parsers.SAXParser";
//如果采用的不是Xerces解析器,只需要更改“parserClass”的值即可。
XMLReader reader=XMLReaderFactory.createXMLReader(parserClass);
//注册ContentHandler
reader.setContentHander(new ContentHandlerImpl());
//注册ErrorHandler
reader.setErrorHandler(new ErrorHandlerImpl());
//注册DTDHandler
//注册EntityResolver
//开始解析XML
URI xmlURI = new URI("xml file address");
InputSource src = new InputSource(xmlURI);
reader.parser(src);
---------几个需要注意的地方---------
1.解析器不支持SAX2.0怎么办?
采用ParserAdapter辅助类来使SAX1.0解析器像SAX2.0那样工作,唯一缺憾就是不能报告那些被忽略的实体,对大多数应用来说这也不所谓。
String parserClass = "org.apache.xerces.parsers.SAXParser";
Parser parser=ParserFactory.makeParser(parserClass);
ParserAdpter myParser=new ParserAdpter(parser);
myParser.setContentHandler(new ContentHandlerImpl());
myParser.setErrorHandler(new ErrorHanlderImpl());
myParser.parser(xmlUri);
2.XMLReader不能同时解析多个XML
一旦XMLReader开始解析一个XML,在解析过程中如果试图再使用阅读器,就会得到SAXException,如果需要同时解析多个XML,只能顺序一个一个解析。或者声明多个XMLReader实例。
3.characters()中的注意
public void characters(char[] ch, int start, int length){
//容易出现Bug的使用方法
for(int i=0; i<ch.length; i++){
System.out.pringln(ch[i])
}
//不会出现问题的使用方法
String str= new String(ch,start,length);
}
分享到:
相关推荐
SAX解析器逐行读取XML文档,当遇到如文档开始、元素开始、元素结束、属性等结构时,会触发相应的事件,并调用用户定义的处理器方法。这种方式使得SAX解析相比DOM(Document Object Model)更加轻量级和高效,因为它...
SAX解析器以流式的方式读取XML文档,当遇到文档的各个元素时,会触发相应的事件,如开始文档、开始元素、结束元素、字符数据等。程序员通过实现SAX解析器的回调接口来处理这些事件,从而解析XML内容。这种方式使得...
Java解析XML数据主要涉及到...总的来说,SAX解析器是Java处理XML文档的一种高效方式,特别适合处理大文件或资源有限的情况。通过自定义事件处理器,我们可以灵活地解析XML文档中的特定信息,而不必一次性加载整个文档。
相较于DOM(Document Object Model)解析器,SAX解析器占用更少的内存和处理时间,因为它不会一次性加载整个XML文档到内存,而是采用事件驱动的方式逐个处理XML元素。在本项目中,"saxloadxml"应该是实现了一个SAX...
SAX解析器遵循XML规范,如XML 1.0或XML 1.1。 2. **事件处理程序(Event Handler)**:当解析器读取XML文档时,会调用预先注册的事件处理程序方法,例如startElement()、endElement()、characters()等。 3. **解析...
然后,我们创建一个主类,用于初始化SAX解析器并开始解析XML文档。 ```java import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.File; public class SaxDemo { ...
SAX解析器的工作原理是基于事件驱动的,它在解析XML文档时会触发一系列的事件,如开始文档、结束文档、开始元素、结束元素等。开发者通过实现SAX解析器的回调接口(如ContentHandler),在这些事件发生时执行相应的...
SAX解析器不创建整个XML文档树,而是当遇到XML文档的各个部分(如元素、属性、文本等)时,触发相应的事件回调函数。开发者通过实现SAX解析器的ContentHandler接口,定义这些回调函数来处理这些事件。 以下是使用...
常见的 XML 解析器有 DOM、SAX、JDOM 和 DOM4J 等。每种解析器都有其特点和优缺,选择合适的解析器对应用程序的性能和开发效率有很大影响。 1. DOM 解析器 DOM(Document Object Model)是 W3C 官方标准,用于表示...
本压缩包文件“XML-java.rar”包含了关于使用Java解析XML的实例,特别强调了SAX解析器的使用,并且提到了使用JDOM和JOM4J这两个Java库来处理XML。 1. **DOM解析**:DOM是一种树型结构,它将整个XML文档加载到内存中...
SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式对XML文档进行解析,而不是一次性加载整个文档到内存中,因此在处理大型XML文件时,SAX解析器具有较高的性能和较低的内存消耗。 标题“sax解析...
3. **事件处理**: 在解析过程中,SAX解析器会调用我们在`DefaultHandler`子类中定义的方法。例如: - `startElement(String uri, String localName, String qName, Attributes attributes)`:当遇到开始元素时,uri...
标题中提到的"XML通过SAX解析为JSON格式"是指使用SAX解析器来读取XML文档,并将其转换成等效的JSON对象。SAX解析器以流式方式处理XML,当遇到文档的不同部分(如开始标签、结束标签、文本节点等)时,会触发相应的...
首先,SAX解析器以流式方式读取XML文档,当遇到文档的不同部分时,会触发相应的事件,如开始文档、开始元素、结束元素等。开发者可以注册事件处理器来响应这些事件,从而获取XML元素的信息。 1. **初始化解析器**:...
本篇文章将详细介绍如何在Android环境中使用SAX解析器来处理从网络获取的XML文件。 1. **XML与SAX解析基础** - XML是一种结构化的文本数据表示方式,它定义了标签、属性等规则,使数据具有自解释性。 - SAX解析器...
SAX解析器逐行读取XML文件,只在需要时处理数据,显著降低了内存需求。 SAX解析的核心在于事件驱动模型。当解析器读取XML文件时,遇到开始元素、结束元素、字符数据等,它会触发相应的事件,并调用预先注册的处理器...
SAX(Simple API for XML)是XML解析的一种方式,它以事件驱动模型来处理XML文档,相比于DOM(Document Object Model)解析,SAX解析器占用更少的内存,更适合处理大型XML文件。 SAX解析的基本原理是读取XML文档,...
代码示例中没有给出完整的SAX解析器实现,但通常会包括`SAXParserFactory`创建`SAXParser`,然后使用`parse`方法解析XML文件,并传入自定义的`DefaultHandler`子类实例。 总结: DOM解析器适合对XML文档进行随机...
然而,SAX解析器不支持直接修改XML文档,只能进行读取操作。此外,由于事件驱动的特性,编程模式较为复杂,开发者需要编写事件处理器来响应解析过程中的各种事件。 在选择DOM或SAX解析时,通常需要权衡以下因素: -...