DOM处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的:这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存。更甚的是,Java VM中最耗资源的一个动作就是new一个对象,要存储DOM中的节点相对应得也就要new很多个对象,对性能的影响显而易见了。
在SAX解析器装载XML文件时,它遍历文件文档并在其主机应用程序中产生事件(经由回调函数
、指派函数
或者任何可调用平台完成这一功能)表示这一过程。在文档的开始和结束时触发文档处理事件。在文档内每一XML元素接受解析的前后触发元素
事件。任何元数据通常都由单独的事件交付。在处理文档的DTD或Schema时产生DTD
或Schema事件。错误事件用来通知主机应用程序解析错误。
SAX对DOM,在什么情况下采用这种或者那种API
并没有确定的严格规则;具体情况具体分析。所有的SAX处理都在一次遍历中完成的;因此,在解析同等大小的文档时SAX通常会相比DOM提供更好的性能
(因为DOM必须遍历树
结构)。此外,与DOM是比,因为在给定的时间之内只需要XML文档的一部分装入内存,所以SAX通常在处理更大文件时内存的利用效率也来得更高(DOM在开始解析文档之前必须把全部XML文档装入内存)。
SAX也不是没有缺点。SAX应用程序一般都比较长,程序中充斥着大量的if/else结构用来确定处理特定元素
时所采用的运动。同样的,处理多个XML元素之间散布的数据结构也很成问题,因为解析事件之间必须保存中间数据。最后,SAX应用程序的事件
处理结构一般意味着SAX应用程序是针对特定文件结构定制构建的,而DOM应用程序则更具一般性。
下面献上自己写的一个例子,写的不好望多多包含:
public class SAXCounter2 extends DefaultHandler {
public static void main(String[] args) {
String fileName = "main.xml";
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = null;
try {
saxParser = spf.newSAXParser();// 创建出SAX解析
// 将解析器和解析对象XMLDOMData.xml联系起来,同时指定事件回调方法的对象开始解析
saxParser.parse(new File(fileName), new SAXCounter2());
} catch (SAXException se) {
System.err.println(se.getMessage());
System.exit(1);
} catch (IOException ioe) {
System.err.println(ioe);
System.exit(1);
} catch (Exception ex) {
System.err.println(ex);
System.exit(1);
}
}
// 定义开始解析xml的方法
public void startDocument() throws SAXException {
System.out.println("SAX Event: START DOCUMENT(文档开始)");
}
public void endDocument() throws SAXException {
System.out.println("SAX Event: END DOCUMENT(文档结束)");
}
// 对每一个<xxx>开始元属性进行处理
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) throws SAXException {
// 打印除该标签的名称
System.out.println("SAX Event: START ELEMENT[ " + qName + " ]");
for (int i = 0; i < atts.getLength(); i++) // 如果 有属 性,我 们 也一并打 印 出来...
{
/*
* 对带有属性的标签如何获得其属性值,比较困难。需要编程startElement方法中的Attributes参数
*/
System.out.print("ATTRIBUTE: " + atts.getLocalName(i) + "--VALUE: "
+ atts.getValue(i) + "\n");
}
}
// 在遇到</xxx>结束后
public void endElement(String namespaceURI, String localName, String qName)
throws SAXException {
System.out.println("SAX Event: END ELEMENT[ " + qName + " ]\n");
}
// 这里将是处理<xxx></xxx>之间的标签体的值的方法
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.print("\nSAX Event: CHARACTERS start:");
try {
OutputStreamWriter outw = new OutputStreamWriter(System.out);
outw.write(ch, start, length); // 将该标签体的文字串输出到控制台上
outw.flush();
} catch (Exception e) {
e.printStackTrace();
}
System.out.print("\nSAX Event: CHARACTERS end\n");
}
}
分享到:
相关推荐
Java解析XML数据主要涉及到的是对XML文档的读取和处理,SAX(Simple API for XML)解析器是一种基于事件驱动的解析方式,适用于处理大型XML文件。与DOM(Document Object Model)解析器不同,SAX不需要一次性加载...
SAX解析器是一种基于事件驱动的解析方式,它不会一次性加载整个XML文档,而是逐行读取并触发相应的事件,如开始元素、结束元素、字符数据等。这种方式节省了内存,适合处理大型XML文件,但不支持随机访问,且需要...
SAX解析的基本原理是,当解析器读取XML文档时,遇到每个元素、属性或其他XML结构,都会触发一个特定的事件,开发者可以通过实现SAX解析器的事件接口来响应这些事件。这种方式对比DOM解析(将整个XML文档加载到内存中...
《Java and XML(英文第三版)_java_xml_birdsolc_源码》是关于Java与XML集成编程的一本权威指南,特别适合于那些希望深入理解如何在Java应用程序中有效地使用XML技术的开发者。这本书详细阐述了Java平台上的XML处理...
SAX(Simple API for XML)是一种基于事件驱动的解析方式,它不会一次性加载整个XML文档,而是逐行读取,当遇到文档的某个部分(如开始标签、结束标签等)时,触发相应的事件回调。这种方式内存占用小,适合处理大...
Java SAX(Simple API for XML)解析器是一种基于事件驱动的XML解析方式,它不将整个XML文档加载到内存中,而是逐行读取,当遇到某个事件(如开始标签、结束标签等)时,会触发相应的事件处理器方法。这种方式节省了...
SAX(Simple API for XML)是一种基于事件驱动的解析器,它不将整个XML文档加载到内存中,而是逐行读取,遇到特定的标签时触发相应的事件。这种方式使得SAX解析器在处理大型XML文件时,相比DOM(Document Object ...
标题中的"SAX与JAVA.rar"指的是Java编程语言中用于处理XML文档的一种解析器——SAX(Simple API for XML)。SAX是一种基于事件驱动的解析模型,它以流式的方式读取XML文档,逐个处理XML元素,而不是一次性加载整个...
标题 "POI3.8组件研究(七)--基于XSSF and SAX (Event API)事件的解析" 提到了Apache POI库的一个高级话题,主要关注的是如何使用XSSF(XML Spreadsheet Formatting Streams)和SAX(Simple API for XML)的Event ...
Java SAX方式解析XML文档是一种高效的处理大型XML文件的方法,它基于事件驱动模型,不将整个XML文档加载到内存中,而是逐个处理XML元素。这种方式非常适合处理大文件,因为它节省了内存,但需要编写更多的代码来处理...
Java 解析 XML 文件的 DOM 和 SAX 方式 Java 解析 XML 文件的 DOM 和 SAX 方式是指在 Java 中使用 Document Object Model(DOM)和 Simple API for XML(SAX)两种方式来解析 XML 文件的技术。下面将详细介绍这两种...
7. **集成与兼容性**:VTD-XML库可以轻松地集成到Java项目中,同时也提供了.NET版本,兼容C#和VB.NET等语言。此外,它还与其他XML工具和标准如XPath、XSLT和XML Schema有良好的互操作性。 8. **源码开放**:VTD-XML...
XML(eXtensible Markup Language)是一种用于存储和传输数据的标准格式,特别是在Java应用程序中,XML经常被用来作为数据交换的载体。Java提供了多种解析XML的API,包括SAX(Simple API for XML)、DOM(Document ...
Java编程语言在处理XML数据时提供了多种方法,其中SAX(Simple API for XML)解析器是一种基于事件驱动的解析方式,适用于处理大型XML文件。它不会一次性加载整个XML文档到内存,而是逐行读取,当遇到XML元素的开始...
其中,SAX(Simple API for XML)是一种基于事件驱动的XML解析器,它可以快速高效地读取XML文件。 二、SAX解析XML配置文件 在本文中,我们使用SAX解析XML配置文件。首先,我们需要创建一个ConfigParser类,该类...
当我们需要从XML文件中提取数据并创建相应的Java对象时,可以使用DOM(Document Object Model)、SAX(Simple API for XML)或StAX(Streaming API for XML)等解析器。DOM解析器一次性加载整个XML文档到内存,形成...
本示例"XMLDemo_java.rar"是基于Java实现的XML处理程序,涵盖了SAX(Simple API for XML)和DOM(Document Object Model)两种解析方式。 1. **SAX解析**: SAX是一种事件驱动的解析器,它不会一次性加载整个XML...
- JDBC-XML:Java标准库中的接口,支持XML数据类型的SQL操作。 9. **XML安全**: - XML签名:确保XML文档的完整性和来源的真实性。 - XML加密:保护XML数据的隐私,防止未经授权的访问。 通过深入学习和实践...
以下是一个简单的SAX解析XML文件的Java代码示例: ```java import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler;...
4. **SOAP(Simple Object Access Protocol)和RESTful Web Services**:Java可以通过Apache CXF、Jersey等框架实现基于XML的SOAP服务或RESTful服务。SOAP是一种基于XML的协议,用于在不同系统间交换结构化信息;...