为JDOM解析XML文件成Document加速

我们用 JDOM 解析 XML 最简单的代码莫过于以下两行代码,不过为了测试我们在其前后加上记录执行时间的代码:

long start = System.currentTimeMillis();
SAXBuilder builder = new SAXBuilder();
Document document = builder.build("struts-config.xml");
System.out.println("耗时:" + (System.currentTimeMillis()-start)+" 毫秒.");
long start = System.currentTimeMillis();
SAXBuilder builder = new SAXBuilder();
Document document = builder.build("struts-config.xml");
System.out.println("耗时:" + (System.currentTimeMillis()-start)+" 毫秒.");

在这个 struts-config.xml 中的 DTD 声明如下:

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_3.dtd">
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_3.dtd">

正常执行时,打印出的耗时是 2698 毫秒(五次的平均值),这是能正常访问 http://jakarta.apache.org/struts/dtds/struts-config_1_3.dtd 的情况下。假如把网线拔了,再执行上面的代码,就会报出下面的异常:

Exception in thread "main" java.net.UnknownHostException: jakarta.apache.org
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:177)
.......................................................
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:977)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:677)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1315)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(XMLEntityManager.java:1282)
at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(XMLDTDScannerImpl.java:283)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1176)
........................................................

很明显,前面的代码要从网络上读取 struts-config_1_3.dtd 来进行验证,于是有了第一个加速的办法:本地 DTD 验证。从本地读取 struts-config_1_3.dtd 文件,从 http://jakarta.apache.org/struts/dtds/struts-config_1_3.dtd 下载 struts-config_1_3.dtd 放到 struts-config.xml 同一目录。然后修改 struts-config.xml 的 DTD 声明如下:

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"struts-config_1_3.dtd">
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"struts-config_1_3.dtd">

再执行上面的代码,打印出的耗时是 717 毫秒(五次的平均值),比前面的 2698 节省了 73.4 的时间,我所用的网络带宽也是能 BT 到 250 K的那种。

前面两种情况都是进行了 DTD 验证的情形,如果我们能给予 XML 充分信任时,就可以不进行 DTD 验证,这是一种极端,这时候管不管你有没有接网线都不在乎了。因此这第二种办法就是 不进行 DTD 验证。

查了一下 SAXBuilder 的 API http://www.jdom.org/docs/apidocs/org/jdom/input/SAXBuilder.html,有构造方法 SAXBuilder(boolean validate) 和一个实例方法 setValidation(boolean validate) 。望文生义,似乎把参数设置为 false,就能合乎不进行 DTD 验证的要求,可是错了,validate 的默认值就是 false。SAXBuilder 还有一个方法 setDTDHandler(org.xml.sax.DTDHandler dtdHandler) 好像也是干这事的,于是试了一下让 DTDHandler 无所作为:

builder.setDTDHandler(new DTDHandler(){
public void notationDecl(String name, String publicId,
String systemId) throws SAXException {
}
public void unparsedEntityDecl(String name, String publicId,
String systemId, String notationName) throws SAXException {
}
});
builder.setDTDHandler(new DTDHandler(){
public void notationDecl(String name, String publicId,
String systemId) throws SAXException {
}
public void unparsedEntityDecl(String name, String publicId,
String systemId, String notationName) throws SAXException {
}
});

时间: 2024-10-29 13:41:30

为JDOM解析XML文件成Document加速的相关文章

java 使用JDOM解析xml文件

java中如何使用JDOM解析xml文件呢?以下小编就用实例为大家详细的介绍一下.需要的朋友可以参考下   JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析.生成.序列化以及多种操作.JDOM直接为JAVA编程服务.它利用更为强有力的JAVA语言的诸多特性(方法重载.集合概念以及映射),把SAX和DOM的功能有效地结合起来. JDOM的官方地址:http://www.jdom.org/1.首先新建一个接口和2个类,为后续做准备[Moveable.java] 复制代

急急!为什么Applet中运用JDOM解析XML文件时,构造文档时失败啊

问题描述 为什么Applet中运用JDOM解析XML文件时,构造文档时失败啊SAXBuildersb=newSAXBuilder();Documentdoc=sb.build("E:/sample.xml");在main()程序中就不会有这样的问题,是不是安全问题请各路大侠帮忙了,谢啦!!!

java 使用JDOM解析xml文件_java

JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析.生成.序列化以及多种操作.JDOM直接为JAVA编程服务.它利用更为强有力的JAVA语言的诸多特性(方法重载.集合概念以及映射),把SAX和DOM的功能有效地结合起来.JDOM的官方地址:http://www.jdom.org/1.首先新建一个接口和2个类,为后续做准备[Moveable.java] 复制代码 代码如下: package com.njupt.zhb.test;public interface Mov

深入浅出如何解析xml文件---下篇

    在上篇博文中,小编主要介绍xml的两种解析方式,分别是dom4j和dom,今天这篇博文,小编主要来简单介绍一下xml的其她两种解析方式sax和jdom.     sax解析xml文件     sax,全称是Simple API for XML ,即是一种接口,也是一种软件包,她也是一种xml解析的替代方法,sax不同于dom解析,她逐行扫描文档,一边扫描一边解析,由于应用程序只是在读取数据时检查数据,因为不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势.     sax这种处理

jsp解析xml文档之使用 JDOM 读取XML文件

jsp教程解析xml文档之使用 JDOM 读取XML文件 xml文件: <?xml version="1.0" encoding="GB2312"?> <RESULT>   <VALUE>        <NO>A1234</NO>        <ADDR>四川省XX县XX镇XX路X段XX号</ADDR>   </VALUE>   <VALUE>      

xml-The markup in the document .. 解析XML文件

问题描述 The markup in the document .. 解析XML文件 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:contex

JDOM操作XML文件(法老修正版)

dom|xml 原文:JDOM操作XML文件地址:http://www.jspcn.net/htmlnews/200120272.html---------------------------------------------------------------------------    这篇文章讲的不错~把JDOM的基本操作实例化了,不过由于当时的作者用的JDOM版本还比较陈旧,所以部分代码会编译出错!支持中文也不好!所以,法老在原作者的基础上对程序做了修改!休正了编译出错以及中文乱码的

Android 解析XML 文件的四种方法总结_Android

java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以

Android 解析XML 文件的四种方法总结

java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以