`
zhiweiofli
  • 浏览: 511721 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java与XML原来可以这么简单--基于SAX标准

阅读更多

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");
	}

}
 
分享到:
评论

相关推荐

    xerces-c++-3.1.3

    Xerces分析器可处理Java和C++,它采用互联网联盟XML、文件对象模型以及用于XML的简单API标准。所有的Xerces分析器都是模块化可配置的。它为C++版本提供了Perl封装,允许访问Perl的XML分析器,它还提供对统一编码字符...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    本书不仅可以作为java web开发的学习用书,还可以作为从事java web开发的程序员的参考用书和必备手册。此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会...

    JAVA_API1.6文档(中文)

    java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....

    java解析xml及4种常用解析比较

    SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员...

    Java四种操作XML语言入门案例

    基于Java语言的四种方式(java xml dom sax dom4j xpath)操作XML语言入门案例!

    xml2j:用于Java的基于XML Schema SAX的代码生成器-开源

    XML代码生成器和Java框架可帮助您快速,一致地开发大量XML解析器。 与大多数开发工具不同,xml2j不会强迫您使用供应商特定的API。 使用我们的生成器,模型就是API。 代码生成器使用XSLT将XML Schema转换为Java代码,...

    X-O lite:基于SAX的XML到Java的轻量级映射-开源

    该项目提供了一个轻量级的框架,可以将Java对象序列化/反序列化为XML。 该实现基于标准的SAX,但遵循基于面向对象编程的封装范例的原始方法。

    Gei基于Java的XML解析器实现.pdf

    用java解析XML文档,最常用的有两种方法:使用基于事件SAX和基于树和节点的文档对象模型DOM。该文给出一种基于java的采用DOM的XML解析器的实现方法,详细给出了该方法的设计方案和所用到的关键类和算法。

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    本书不仅可以作为java web开发的学习用书,还可以作为从事java web开发的程序员的参考用书和必备手册。此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    本书不仅可以作为java web开发的学习用书,还可以作为从事java web开发的程序员的参考用书和必备手册。此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会...

    DOM和SAX概念的总结

    也可以是基于事件(基于流、推模型)的,如 Simple API for XML(SAX)。JDOM试图用 DOM 和 SAX 20% 的功能来满足 80% 的用户需求,它使用 SAX 和 DOM 解析器,作为一组相对较小的 Java 类被实现。而Java API for XML...

    java xml 增删改查

    它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在 JavaScript中使用DOM)。 3:SAX表现较好,这要依赖于它特定的解析方式...

    JavaAPI1.6中文chm文档 part1

    java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    本书不仅可以作为java web开发的学习用书,还可以作为从事java web开发的程序员的参考用书和必备手册。此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会...

    Java 1.6 API 中文 New

    java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....

    java api最新7.0

    java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....

    JavaAPI中文chm文档 part2

    java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....

    XML解析教程

    SAX(Simple API for XML) 不是某个官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它, SAX解析器采用了基于事件的模型 JDOM(注意JDOM决不是DOM扩展,虽然名字差不多,但两者平行的关系 )是一个...

    经典的DOM解析XML范例

    用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOM。Sun公司提供了Java API for XML Parsing(JAXP)...

Global site tag (gtag.js) - Google Analytics