热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Java中四种XML解析技巧之不完整测试

测试环境:AMD毒龙1.4GOC1.5G、256MDDR333、Windows2000ServerSP4、SunJDK1.4.1+Eclipse2.1+Resin2.1.8,在Debug模式下测试。XML文件格局如下:以下为引用的内容:?xmlversion=1.0encoding=GB

测试环境:

AMD毒龙1.4G OC 1.5G、256M DDR333、Windows2000 Server SP4、Sun JDK 1.4.1 Eclipse 2.1 Resin 2.1.8,在Debug模式下测试。

XML文件格局如下:

以下为引用的内容:

  A1234

  四川省XX县XX镇XX路X段XX号

  B1234

  四川省XX市XX乡XX村XX组

测试方法:

让每一种计划分辨解析10K、100K、1000K、10000K的XML文件,盘算其耗费时间(单位:毫秒)。

以下为引用的内容:

JSP文件:

  <%@ page cOntentType="text/html; charset=gb2312" %><%@ page import="com.test.*"%>

  <%String args[]={""};MyXMLReader.main(args);%>

测试

首先出场的是DOM(JAXP Crimson解析器)

DOM是用与平台和语言无关的方法表现XML文档的官方W3C尺度。DOM是以层次结构组织的节点或信息片段的聚集。这个层次结构答应开发职员在树中寻找特定信息。分析该结构通常需要加载全部文档和结构层次结构,然后才干做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个长处。首先,由于树在内存中是持久的,因此可以修正它以便利用程序能对数据和结构作出更改。它还可以在任何时候在树中高低导航,而不是像SAX那样是一次性的处理。DOM应用起来也要简略得多。

另一方面,对于特别大的文档,解析和加载全部文档可能很慢且很耗资源,因此应用其他手段来处理这样的数据会更好。这些基于事件的模型,比如SAX。

以下为引用的内容:

Bean文件:

  package com.test;

  import java.io.*;import java.util.*;import org.w3c.dom.*;import javax.xml.parsers.*;

  public class MyXMLReader{

  public static void main(String arge[]){

  long lasting =System.currentTimeMillis();

  try{

   File f=new File("data_10k.xml");

   DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

   DocumentBuilder builder=factory.newDocumentBuilder();

   Document doc = builder.parse(f);

   NodeList nl = doc.getElementsByTagName("VALUE");

   for (int i=0;i

    System.out.print("车牌号码:" doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());

    System.out.println("车主地址:" doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());

  }

  }catch(Exception e){

   e.printStackTrace();

  }

  System.out.println("运行时间:" (System.currentTimeMillis() - lasting) "毫秒");}}

  10k耗费时间:265 203 219 172

  100k耗费时间:9172 9016 8891 9000

  1000k耗费时间:691719 675407 708375 739656

  10000k耗费时间:OutOfMemoryError

接着是SAX

这种处理的长处非常类似于流媒体的长处。分析能够立即开端,而不是等候所有的数据被处理。而且,由于利用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个宏大的长处。事实上,利用程序甚至不必解析全部文档;它可以在某个条件得到满足时结束解析。一般来说,SAX还比它的调换者DOM快很多。

选择DOM还是选择SAX?

对于需要自己编写代码来处理XML文档的开发职员来说,选择DOM还是SAX解析模型是一个非常重要的设计决策。

DOM采用建立树形结构的方法拜访XML文档,而SAX采用的事件模型。

DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的长处是编程轻易,开发职员只需要调用建树的指令,然后利用navigation APIs拜访所需的树节点来完成任务。可以很轻易的添加和修正树中的元素。然而由于应用DOM解析器的时候需要处理全部XML文档,所以对性能和内存的请求比拟高,尤其是碰到很大的XML文件的时候。由于它的遍历才能,DOM解析器常用于XML文档需要频繁的转变的服务中。

SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发明给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的请求通常会比拟低,由于它让开发职员自己来决定所要处理的tag。特别是当开发职员只需要处理文档中所包含的部分数据时,SAX这种扩大才能得到了更好的体现。但用SAX解析器的时候编码工作会比拟艰苦,而且很难同时拜访同一个文档中的多处不同数据。

以下为引用的内容:

Bean文件:

  package com.test;import org.xml.sax.*;import org.xml.sax.helpers.*;import javax.xml.parsers.*;

  public class MyXMLReader extends DefaultHandler {

  java.util.Stack tags = new java.util.Stack();

  public MyXMLReader() {

  super();}

  public static void main(String args[]) {

  long lasting = System.currentTimeMillis();

  try {

   SAXParserFactory sf = SAXParserFactory.newInstance();

   SAXParser sp = sf.newSAXParser();

   MyXMLReader reader = new MyXMLReader();

   sp.parse(new InputSource("data_10k.xml"), reader);

  } catch (Exception e) {

   e.printStackTrace();

  }

  System.out.println("运行时间:" (System.currentTimeMillis() - lasting) "毫秒");}

  public void characters(char ch[], int start, int length) throws SAXException {

  String tag = (String) tags.peek();

  if (tag.equals("NO")) {

   System.out.print("车牌号码:" new String(ch, start, length));}if (tag.equals("ADDR")) {

  System.out.println("地址:" new String(ch, start, length));}}

  public void startElement(String uri,String localName,String qName,Attributes attrs) {

  tags.push(qName);}}

  10k耗费时间:110 47 109 78

  100k耗费时间:344 406 375 422

  1000k耗费时间:3234 3281 3688 3312


推荐阅读
author-avatar
被抛弃的微博名
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有