SAX(Simple API for XML)由XML-DEV邮件列表成员开发,目前版本2.0.x,民间标准.http://www.saxproject.org/
SAX是一种基于事件驱动的API。利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。
解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件;而事件处理器则负责对事件作出相应,对传递的XML数据进行处理。
SAX特点:操作XML时不同全部读取到内存中。
SAX的处理机制:
Java代码 <embed type="application/x-shockwave-flash" width="14" height="15" src="http://orz.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22gb2312%22%3F%3E%0A%3Cstudent%3E%0A%20%20%20%3Cname%3E%E5%BC%A0%E4%B8%89%3C%2Fname%3E%0A%3C%2Fstudent%3E%0A"></embed>
- <?xml version="1.0" encoding="gb2312"?>
- <student>
- <name>张三</name>
- </student>
Java代码 <embed type="application/x-shockwave-flash" width="14" height="15" src="http://orz.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%E6%96%87%E6%A1%A3%E5%BC%80%E5%A7%8B%0A%20%20%E5%85%83%E7%B4%A0%E5%BC%80%E5%A7%8B(%3Cstudent%3E)%0A%20%20%20%20%E5%AD%97%E7%AC%A6%E7%A9%BA%E7%99%BD(%22%3E%22%E5%88%B0%22%3C%22%E4%B9%8B%E9%97%B4%E7%9A%84%E7%A9%BA%E7%99%BD)%0A%20%20%20%20%20%20%20%E5%85%83%E7%B4%A0%E5%BC%80%E5%A7%8B(%3Cname%3E)%0A%20%20%20%20%20%20%20%20%20%20%E5%AD%97%E7%AC%A6%E6%95%B0%E6%8D%AE(%E5%BC%A0%E4%B8%89)%0A%20%20%20%20%20%20%20%E5%85%83%E7%B4%A0%E7%BB%93%E6%9D%9F(%3C%2Fname%3E)%0A%20%20%20%20%E5%AD%97%E7%AC%A6%E7%A9%BA%E7%99%BD(%22%3E%22%E5%88%B0%22%3C%2F%22%E4%B9%8B%E9%97%B4%E7%9A%84%E7%A9%BA%E7%99%BD)%0A%20%20%E5%85%83%E7%B4%A0%E7%BB%93%E6%9D%9F(%3C%2Fstudent%3E)%0A%E6%96%87%E6%A1%A3%E7%BB%93%E6%9D%9F%0A"></embed>
- 文档开始
- 元素开始(<student>)
- 字符空白(">"到"<"之间的空白)
- 元素开始(<name>)
- 字符数据(张三)
- 元素结束(</name>)
- 字符空白(">"到"</"之间的空白)
- 元素结束(</student>)
- 文档结束
SAX解析器接口和事件处理器接口在org.xml.sax包中定义。
XMLReader是SAX2.0解析器必须实现的接口。该接口允许应用程序设置和查询解析器的功能和特性,注册处理文档的事件处理器,以及启动文档的解析。
解析器提供商负责提供实现XMLReader接口的解析器类,我们只需编写事件处理器程序。
SAX API中的ContnetHandle接口是一个主要的处理器接口。如果应用程序要获得基本的解析事件就必须实现该接口,并使用XMLReader对象的setContentHandler()向解析器注册一个ContentHandler()实例。解析器使用这个实例来报告与文档相关的基本事件,例如,元素开始和结束,以及字符数据等。在这个接口中,事件的顺序是非常重要的,它反映了文档自身信息的顺序。例如,元素的所有内容(字符数据,处理指令,子元素)都依次在startElement事件和对应的endElement事件之间出现。
void setDocumentLocator(Locator locator)
该方法接收一个用于获取文档分析时产生的SAX事件定位信息的对象。该方法将在解析器报告任何其他文档事件之前被调用。作为参数传递给这个方法的定位器对象,允许应用程序测定任何与文档相关的事件的结束位置。通常,应用程序会使用这个信息来报告它自身的错误(例如,与应用程序的商业规则不匹配的字符内容)。
void startDocument() throws SAXException
该方法接收文档开始的通知。SAX解析器将在任何其它事件回调方法被调用之前调用该方法(除了setDocumentLocator方法),并只调用一次。
void endDocument() throws SAXException
该方法接收文档结束的通知。SAX解析器只调用这个方法一次,而且它是在解析过程中最后一次被调用的方法。
void startPrefixMapping(String prefix,String uri)throws SAXException
void endPrefixMapping(String prefix)throws SAXException
startPrefixMapping()在一个前缀-URI名称空间映射范围的开始时被调用。而endPrefixMapping()在前缀-URI映射范围结束时被调用。例如:下面的XML文档
<students xmlns:stu="http://www.iteye.com/students">
.....
</students>
SAX解析器在分析到<students>元素时,就会调用startPrefixMapping(),将stu传递给prefix参数,将http://www.iteye.com/students传递给uri参数,然后产生<students>元素的startElement事件。在产生<students>元素的endElement事件后,解析器将调用endPrefixMapping(),将stu传递给prefix参数。
void startElement(String uri,String localName,String qName,Attribute atts)throws SAXException
该方法接收元素开始的通知。解析器在xml文档的每一个元素开始时调用这个方法。每一个startElement事件都有一个对应的endElement事件(即使是空元素),在endElement事件之前,元素的所有内容都被依次报告。
这个事件允许每个元素最多有三个名称部分:1.名称空间URI;2.本地名;3.限定名;是否有这几部分,取决于http://xml.org/sax/features/namespaces和http://xml.org/sax/features/namespace-prefixes属性的值.
a.当namespaces属性为true时,名称空间URI和本地名是必须的。当namespaces属性是false,那么二者是可选的(但如果指定了其中一个名称,那么另一个也必须指定)
b.当namespace-prefixes属性为true,那么限定名必需的,否则是可选的,缺省值为false.
注意:属性列表将只包含具有确切值(直接指定或缺省值)的属性,#IMPLIED属性将被忽略。只有当http://xml.org/sax/features/namespace-prefixes属性为true(缺省值为false,解析器对true值的支持是可选的),属性列表才会包括用于名称空间声明的属性(xmlns*属性)
void endElement(String uri,String localName,String qName) throws SAXException
该方法接收元素结束的通知。解析器在XML文档的每一个元素结束时调用这个方法。
void characters(char[] ch,int start,int length)throws SAXException
该方法接收字符数据的通知。解析器调用这个方法来报告字符数据块。SAX解析器会把所有连续的字符数据放在一个单独的块中返回,或者把它们分成几个数据块。不过,在任何一个单独的所有字符都必须来自同一个外部实体,以便Locator提供有用的信息(Locator要提供文档中事件结束的位置信息)。应用程序不要试图读取ch数组中指定范围以外的的数据。注意:有些解析器使用ignorableWhitespace()来报告元素内容中的空白,而不是用characters()(进行有效性验证的解析器就是如此)。
void processingInstruction(String target,String data)throws SAXException
该方法接收处理指令的通知。解析器每遇到一个处理指令就调用该方法一次。注意:处理指令可以在XML文档的根元素(文档元素)之前或之后出现。
void skippedEntity(String name)throws SAXException
该方法接收跳过的实体的通知。解析器每跳过一个实体就会调用该方法。非验证的解析器如果没有看到实体声明的话(例如实体在外部的DTD子集中的声明),可以跳过实体。所有的处理器是否跳过外部的实体取决于http://xml.org/sax/features/external-general-entities和http://xml.org/sax/features/exteral-parameter-entities属性(property)的值。
配置SAX解析器有两种方法:功能和特性。
功能包括打开和关闭某个功能。例如验证。
特性包括设置解析器所使用的特定项的值,例如设置SAX词法分析器实例。
1.功能(feature)是通过XMLReader接口中的setFeature()来设置的,例如要打开验证功能可调用setFeature(): xmlReader.setFeature("http://xml.org/sax/feature/validation",true);
注意:在SAX中每一个功能都是由一个特定的URI来标识,当前的标准功能的URI都以http://xml.org/sax/features/作为前缀,下面列出常用功能的URI:
-http://xml.org/sax/features/namespaces
如果namespace为true,则解析器执行名称空间处理。在事件处理器的相应方法中,所有元素和属性的名称空间URI和未限定的本地名称可以使用。任何SAX2.0兼容的解析器都支持将namespaces的默认值设成true。
-http://xml.org/sax/features/namespace=prefixes
如果namespace-prefixes设为true时,则解析器对名称空间前缀的解析提供支持。在事件处理器的相应方法中,XML限定名(带前缀的名称)和属性(包括xmlns*属性)将可以使用。任何SAX2.0兼容的解析器都支持将namespace-prefixes的默认值设为false。
-http://xml.org/sax/features/external-general-entities
设置解析器是否处理外部的一般实体。如果对解析器启用了验证功能。则external-general-entities将总是true。
-http://xml.org/sax/features/external-parameter-entities
设置解析器是否处理外部的参数实体。如果对解析器启用了验证功能。则external-general-entities将总是true。
-http://xml.org/sax/features/validation
设置解析器是否验证文档。如果为true,则所有的外部实体都将被处理。
2.特性(property)是通过XMLReader接口中的setProperty()来设置的。特性和功能的设置是类似的,区别是特性以对象作为参数,而功能以布尔值作为参数。例如要设置词法分析器实例 ,可调用setProperty(): xmlReader.setProperty("http://xml.org/sax/properties/lexical-handle",new MyLexicalHandler());
SAX解析器工厂:javax.xml.parsers.SAXParserFactory
如果使用Apache的Xerces解析器,可配置如下:
javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl
SAX实例一:
SAXPrinter.java输出跟students.xml一样的数据。
Java代码 <embed type="application/x-shockwave-flash" width="14" height="15" src="http://orz.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=import%20java.io.File%3B%0Aimport%20java.io.IOException%3B%0Aimport%20javax.xml.parsers.ParserConfigurationException%3B%0Aimport%20javax.xml.parsers.SAXParser%3B%0Aimport%20javax.xml.parsers.SAXParserFactory%3B%0Aimport%20org.xml.sax.Attributes%3B%0Aimport%20org.xml.sax.SAXException%3B%0Aimport%20org.xml.sax.helpers.DefaultHandler%3B%0A%0A%2F%2F%E9%87%8D%E5%86%99%E4%BA%86DefaultHandler%E7%9A%845%E4%B8%AA%E6%96%B9%E6%B3%95%0Apublic%20class%20SAXPrinter%20extends%20DefaultHandler%7B%0A%0A%09%40Override%0A%09%2F%2F%E6%96%87%E6%A1%A3%E5%BC%80%E5%A7%8B%0A%09public%20void%20startDocument()%20throws%20SAXException%20%7B%0A%09%09%2F%2F%E8%BE%93%E5%87%BA%E5%8F%8C%E5%BC%95%E5%8F%B7%E5%8F%AF%E4%BB%A5%E7%94%A8%E5%8F%8D%E6%96%9C%E6%9D%A0%E4%B9%9F%E5%8F%AF%E8%BE%93%E5%87%BA%E5%8D%95%E5%BC%95%E5%8F%B7%0A%09%09System.out.println(%22%3C%3Fxml%20version%3D%5C%221.0%5C%22%20encoding%3D'gb2312'%3F%3E%22)%3B%0A%09%7D%0A%09%0A%09%40Override%0A%09%2F%2F%E5%A4%84%E7%90%86%E6%8C%87%E4%BB%A4%0A%09public%20void%20processingInstruction(String%20target%2C%20String%20data)%20throws%20SAXException%20%7B%0A%09%09System.out.println(%22%3C%3F%22%2Btarget%2B%22%20%22%2Bdata%2B%22%3F%3E%22)%3B%0A%09%7D%0A%09%0A%09%40Override%0A%09%2F%2F%E5%85%83%E7%B4%A0%E5%BC%80%E5%A7%8B%0A%09public%20void%20startElement(String%20uri%2C%20String%20localName%2C%20String%20qName%2C%20Attributes%20attrs)%20throws%20SAXException%20%7B%0A%09%09System.out.print(%22%3C%22%2BqName)%3B%0A%09%09int%20len%20%3D%20attrs.getLength()%3B%0A%09%09for(int%20i%3D0%3Bi%3Clen%3Bi%2B%2B)%7B%0A%09%09%09System.out.print(%22%20%22)%3B%0A%09%09%09System.out.print(attrs.getQName(i))%3B%0A%09%09%09System.out.print(%22%3D%5C%22%22)%3B%0A%09%09%09System.out.print(attrs.getValue(i))%3B%0A%09%09%09System.out.print(%22%5C%22%22)%3B%0A%09%09%7D%0A%09%09System.out.print(%22%3E%22)%3B%0A%09%7D%0A%09%0A%09%40Override%0A%09%2F%2F%E5%A4%84%E7%90%86%E5%AD%97%E7%AC%A6(%E7%94%B1%E7%A9%BA%E7%99%BD%E7%BB%84%E6%88%90%E7%9A%84%E6%95%B0%E6%8D%AE%EF%BC%8C%E5%8F%AF%E4%BB%A5%E7%9C%8B%E6%88%90%E6%A0%BC%E5%BC%8F)%0A%09public%20void%20characters(char%5B%5D%20ch%2C%20int%20start%2C%20int%20length)%20throws%20SAXException%20%7B%0A%09%09System.out.print(new%20String(ch%2Cstart%2Clength))%3B%0A%09%7D%0A%0A%0A%09%40Override%0A%09%2F%2F%E5%85%83%E7%B4%A0%E7%BB%93%E6%9D%9F%0A%09public%20void%20endElement(String%20uri%2C%20String%20localName%2C%20String%20qName)%20throws%20SAXException%20%7B%0A%09%09System.out.print(%22%3C%2F%22%2BqName%2B%22%3E%22)%3B%0A%09%7D%0A%0A%09public%20static%20void%20main(String%5B%5D%20args)%20%7B%0A%09%09SAXParserFactory%20spf%20%3D%20SAXParserFactory.newInstance()%3B%0A%09%09try%20%7B%0A%09%09%09SAXParser%20sp%20%3D%20spf.newSAXParser()%3B%0A%09%09%09sp.parse(new%20File(%22students.xml%22)%2Cnew%20SAXPrinter())%3B%0A%09%09%7D%20catch%20(ParserConfigurationException%20e)%20%7B%0A%09%09%09%2F%2F%20TODO%20%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90%20catch%20%E5%9D%97%0A%09%09%09e.printStackTrace()%3B%0A%09%09%7D%20catch%20(SAXException%20e)%20%7B%0A%09%09%09%2F%2F%20TODO%20%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90%20catch%20%E5%9D%97%0A%09%09%09e.printStackTrace()%3B%0A%09%09%7D%20catch%20(IOException%20e)%20%7B%0A%09%09%09%2F%2F%20TODO%20%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90%20catch%20%E5%9D%97%0A%09%09%09e.printStackTrace()%3B%0A%09%09%7D%0A%09%7D%0A%0A%7D%0A"></embed>
- import java.io.File;
- import java.io.IOException;
- 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;
-
-
- public class SAXPrinter extends DefaultHandler{
-
- @Override
-
- public void startDocument() throws SAXException {
-
- System.out.println("<?xml version=\"1.0\" encoding='gb2312'?>");
- }
-
- @Override
-
- public void processingInstruction(String target, String data) throws SAXException {
- System.out.println("<?"+target+" "+data+"?>");
- }
-
- @Override
-
- public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException {
- System.out.print("<"+qName);
- int len = attrs.getLength();
- for(int i=0;i<len;i++){
- System.out.print(" ");
- System.out.print(attrs.getQName(i));
- System.out.print("=\"");
- System.out.print(attrs.getValue(i));
- System.out.print("\"");
- }
- System.out.print(">");
- }
-
- @Override
-
- public void characters(char[] ch, int start, int length) throws SAXException {
- System.out.print(new String(ch,start,length));
- }
-
-
- @Override
-
- public void endElement(String uri, String localName, String qName) throws SAXException {
- System.out.print("</"+qName+">");
- }
-
- public static void main(String[] args) {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- try {
- SAXParser sp = spf.newSAXParser();
- sp.parse(new File("students.xml"),new SAXPrinter());
- } catch (ParserConfigurationException e) {
-
- e.printStackTrace();
- } catch (SAXException e) {
-
- e.printStackTrace();
- } catch (IOException e) {
-
- e.printStackTrace();
- }
- }
-
- }
SAX实例二:
ErrorProcessor.java演示错误处理器的使用
如果SAX应用程序需要实现定制的错误处理,那么它必须实现这个接口,并调用XMLReader对象的setErrorHandler()向解析器注册一个实例。之后解析器将通过这个接口报告所有的错误和
警告。
students2.xml
Java代码 <embed type="application/x-shockwave-flash" width="14" height="15" src="http://orz.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22gb2312%22%3F%3E%0A%0A%3C%3Fxml-stylesheet%20type%3D%22text%2Fxsl%22%20href%3D%22student.xsl%22%3F%3E%0A%0A%3C!DOCTYPE%20students%5B%0A%3C!ELEMENT%20students%20(student%2B)%3E%0A%3C!ELEMENT%20student%20(name%2Cage%2Cscore)%3E%0A%3C!ELEMENT%20name%20(%23PCDATA)%3E%0A%3C!ELEMENT%20age%20(%23PCDATA)%3E%0A%3C!ELEMENT%20score%20(%23PCDATA)%3E%0A%3C!ATTLIST%20student%20sn%20CDATA%20%23REQUIRED%3E%0A%5D%3E%0A%0A%3Cstudents%3E%0A%20%20%3Cstudent%20sn%3D%2201%22%3E%0A%20%20%20%20%20%3Cname%3E%E5%BC%A0%E4%B8%89%3C%2Fname%3E%0A%20%20%20%20%20%3Cage%3E11%3C%2Fage%3E%0A%20%20%3C%2Fstudent%3E%0A%20%20%3Cstudent%20sn%3D%2202%22%3E%0A%20%20%20%20%20%3Cname%3E%E6%9D%8E%E5%9B%9B%3C%2Fname%3E%0A%20%20%20%20%20%3Cage%3E14%3C%2Fage%3E%0A%20%20%3C%2Fstudent%3E%0A%3C%2Fstudents%3E%0A"></embed>
- <?xml version="1.0" encoding="gb2312"?>
-
- <?xml-stylesheet type="text/xsl" href="student.xsl"?>
-
- <!DOCTYPE students[
- <!ELEMENT students (student+)>
- <!ELEMENT student (name,age,score)>
- <!ELEMENT name (#PCDATA)>
- <!ELEMENT age (#PCDATA)>
- <!ELEMENT score (#PCDATA)>
- <!ATTLIST student sn CDATA #REQUIRED>
- ]>
-
- <students>
- <student sn="01">
- <name>张三</name>
- <age>11</age>
- </student>
- font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; mar
分享到:
相关推荐
SAX(Simple API for XML)是一种轻量级的解析XML数据的方法,相比于DOM解析,它更节省内存,更适合处理大型XML文件。SAX是事件驱动的解析器,它读取XML文档并触发一系列的事件,如开始文档、开始元素、字符数据等,...
3. **配置解析器**:创建一个`SAXParserFactory`实例,并使用它来获取`SAXParser`,然后设置自定义的处理程序。 ```java SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = ...
SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...
本实例结合了Java、SAX解析器和Struts框架,来实现RSS feed的读取与展示。 首先,我们来详细理解Java中的SAX解析。SAX解析器并不将整个XML文档加载到内存中,而是通过触发一系列的事件(如开始元素、结束元素、字符...
本篇我们将深入探讨SAX(Simple API for XML)解析XML的实例。 SAX,全称为Simple API for XML,是一种基于事件驱动的解析方式。与DOM(Document Object Model)解析器不同,SAX并不将整个XML文档加载到内存中形成...
XML(eXtensible Markup ...通过实践这两个解析实例,开发者可以更好地理解它们的工作原理,根据项目需求选择合适的解析方式。在实际应用中,也可以结合两者,利用DOM的灵活性和SAX的高效性,实现更复杂的XML处理逻辑。
SAX操作XML实例主要涉及到以下几个核心知识点: 1. **事件驱动解析**:SAX解析器不将整个XML文档加载到内存中,而是逐行读取文档,当遇到元素、属性、文本等结构时,会触发相应的事件。程序员通过实现SAX解析器的回...
在Java中,我们通常使用`org.xml.sax.Parser`或`javax.xml.parsers.SAXParser`接口,通过`SAXParserFactory`工厂类来创建解析器实例。 2. **事件驱动模型**:SAX解析基于事件驱动,当解析器读取XML文档时,会触发一...
以上就是DOM、SAX和XPath解析XML的基本知识和实例应用。通过这些技术,开发者可以根据实际需求选择最适合的方式来处理XML文档。在实际项目中,这三种解析方法都有其适用场景,理解它们的工作原理和优缺点,将有助于...
本文将详细介绍这两种解析方式,并通过一个具体的XmlPullParserDemo实例来深入理解它们的工作原理和使用方法。 首先,让我们了解什么是XML。XML(eXtensible Markup Language)是一种标记语言,常用于存储和传输...
使用SAX方式解析XML SAX 是读取和操作 XML 数据的更快速、更轻量的方 法。SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及 DOM 所必需的开销和概念跳跃。 SAX API是一个基于事件...
通过30个DOM实例、14个SAX实例和29个.NET框架处理XML实例,读者可以掌握各种XML处理技术的特点和应用场景,提高数据处理效率。 ### XSLT与CSS XSLT(Extensible Stylesheet Language Transformations)用于转换XML...
以下是对SAX解析XML在Android中的详细解释以及实例代码分析。 **一、SAX解析XML原理** 1. **事件驱动**:SAX解析器在读取XML文档时,会调用预先定义好的处理器接口(如`DefaultHandler`)中的方法,如`...
1. **初始化解析器**:创建一个SAX解析器实例,例如使用`SAXParserFactory`创建,并设置所需的配置,如命名空间支持。 2. **注册事件处理器**:设置一个`DefaultHandler`或自定义的`ContentHandler`,该处理器会处理...
标题"读取RSS-SAX解析XML实例(java版)"所涉及的知识点主要集中在两个方面:一是如何读取RSS(Really Simple Syndication)数据,二是使用SAX解析XML文件。 RSS是一种用于发布新闻、博客和其他定期更新内容的格式...
SAX解析是一种流式的XML解析方式,它使用了一种基于事件的模型来处理XML文档。开发者不需要在内存中构建整个文档的树形结构,而是通过响应XML解析器发出的事件来处理XML文档。这种方式特别适合处理大型的XML文件,...
本篇将详细讲解Android中三种主要的XML解析方式:SAX(Simple API for XML)、DOM(Document Object Model)和Pull解析器,并通过案例来帮助理解它们的工作原理和应用场景。 ### 1. SAX解析器 SAX(Simple API for...