文档章节

XML 解析 连接超时

learn_more
 learn_more
发布于 2015/05/09 20:30
字数 733
阅读 256
收藏 6

本文转载自:

     http://blog.csdn.net/chjttony/article/details/7720873

说在前面

    读取XML的时候,很多人总是不明白为什么会连接超时,XML解析怎么还会访问网络,其实在XML解析之前,如果XML指定了DTD文件,那么Java会根据DTD文件的路径去本地寻找或远程下载,下载的时候就会出现连接超时!所以想要避免连接超时这个问题,就可以采用避免DTD下载,下面通过两种方式避免DTD下载,本人亲测,确实是一篇好文章,谢谢作者!

    

下面是正文:

Java程序在解析xml文件时,如果xml文件中指定了dtd,在默认会从指定的url下载dtd文件,但是很多情况下如果网络连接不上,或者防火墙原因,dtd文件无法下载下来导致程序报连接超时异常,解析xml失败。有两种方法解决该类问题:

1.指定从本地读取dtd文件

若要解析的xml文件中有如下的dtd声明:

<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "
http://docs.oasisopen.org/dita/v1.2/os/dtd1.2/technicalContent/dtd/concept.dtd
">

publicId:被引用的外部实体的公共标识符,如果未提供,则为 null。

                上述的dtd声明中publicId为-//OASIS//DTD DITA Concept//EN

systemId:被引用的外部实体的系统标识符。

                 上述的dtd声明中systemId为http://docs.oasis-open.org/dita/v1.2/os/dtd1.2/technicalContent/dtd/concept.dtd

可以通过重新SAX的EntityResolver类的resolveEntity(String publicId, String systemId) throws SAXExceptionIOException方法指定读取本地的dtd文件,该放在在XML解析器解析xml之前调用,用于加载指定的dtd文件:

/**
 * Implementation of <code>org.xml.sax.EntityResolver</code> that loads
 * entitities (for example dtd files) from the classpath.
 */
public class ClasspathEntityResolver
    implements EntityResolver
{
    public InputSource resolveEntity(String publicId, String systemId)
        throws SAXException, IOException
    {
     
        if (systemId != null)
        {
           
            int index = systemId.lastIndexOf('/');
            if (index != -1)
            {
             systemId = systemId.substring(index + 1);
            }
            systemId = "/" + systemId;
            InputStream istr = Thread.currentThread().getContextClassLoader().getResourceAsStream(systemId);
            if (istr != null)
            {
                return new InputSource(istr);
            }
        }
        return null;
    }
}

在SAX解析xml文件之前,指定使用自定义的ClasspathEntityResolver:

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = spf.newSAXParser(); 
xmlReader = saxParser.getXMLReader();
xmlReader.setEntityResolver(new ClasspathEntityResolver());
xmlReader.setContentHandler(handler);
try {
 xmlReader.parse(new InputSource(inputFilePath));
 } catch (Exception e) {
  e.printStackTrace();
 }

注意:

  经测试发现,这种方法只对SYSTEM(本地dtd)有效,如:

<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "
http://docs.oasisopen.org/dita/v1.2/os/dtd1.2/technicalContent/dtd/concept.dtd
">

  PUBLIC方式的dtd依然从外部下载dtd,只能通过第二种方式忽略dtd校验。


2.解析xml文件时彻底忽略dtd:

SAX解析器可以通过指定http://apache.org/xml/features/nonvalidating/load-external-dtd属性来确定是否忽略dtd,例子如下:

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = spf.newSAXParser();
    
xmlReader = saxParser.getXMLReader();
xmlReader.setFeature("
http://apache.org/xml/features/nonvalidating/load-external-dtd
", false);
xmlReader.setContentHandler(handler);
try {
xmlReader.parse(new InputSource(inputFilePath));
} catch (Exception e) {
e.printStackTrace();
}




本文转载自:http://blog.csdn.net/chjttony/article/details/7720873

learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
跨平台网络通信与服务器框架 acl 3.2.0 发布

acl 3.2.0 版本发布了,acl 是 one advanced C/C++ library 的简称,主要包括网络通信库以及服务器框架库等功能,支持 Linux/Windows/Solaris/FreeBsd/MacOS 平台;整个 acl 项目主要包含三个...

郑树新
2016/08/27
1K
4
【Ovirt 笔记】engine 与 vdsm 之间的调用分析 JSON-RPC

文前说明 作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。 本文仅供学习交流使用,侵权必删。 不用...

羽杰
2018/05/31
0
0
acl 3.1.4 发布,跨平台网络通信与服务器编程框架

acl 3.1.4 版本发布了,acl 是 one advanced C/C++ library 的简称,主要包括网络通信库以及服务器框架库等功能,支持 Linux/Windows/Solaris/FreeBsd/MacOS 平台;整个 acl 项目主要包含三个...

郑树新
2015/12/20
2.9K
6
DBeaver 社区版 6.2.1 发布,可视化数据库管理工具

DBeaver 社区版 6.2.1 已发布。 值得关注的更新 Data viewer: 改进了空间(GIS)的表示方式(工具提示、不同列的不同形状颜色) 改善 JSON 渲染性能 修复 XML 值查看器 修复 XML 自动格式化...

xplanet
09/24
1K
12
tomcat最大连接数修改

1 tomcat 的server.xml的路径vim /usr/local/tomcat/conf/server.xml 1.1 最大连接数相关 maxThreads:表示最多同时处理的连接(以上是50个)minSpareThreads:表示没有没有使用也开这么多空...

zjycff
2017/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka实战(五) - 核心API及适用场景全面解析

1 四个核心API ● Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。 ● Consumer API 允许一个应用程序订阅一个或多个topic ,并且对发布给他们的流式数据进行处...

JavaEdge
今天
11
0
实现线程的第三种方式——Callable & Future

Callable Runnable 封装一个异步运行的任务, 可以把它想象成为一个没有参数和返回值的异步方 法。Callable 与 Runnable 类似, 但是有返回值。Callable 接口是一个参数化的类型, 只有一 个...

ytuan996
今天
11
0
OSChina 周六乱弹 —— 不要摁F了!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 : 朴树写的词曲都给人一种莫名的失落感,不过这首歌他自己却没有唱,换成赵传这种高音阶嘶喊的确很好,低沉但却有力,老男人的呐喊...

小小编辑
今天
22
0
Android Binder机制 - interface_cast和asBinder讲解

研究Android底层代码时,尤其是Binder跨进程通信时,经常会发现interface_cast和asBinder,很容易被这两个函数绕晕,下面来讲解一下: interface_cast 下面根据下述ICameraClient例子进行分析...

天王盖地虎626
昨天
13
0
计算机实现原理专题--存储器的实现(二)

计算机实现原理专题--存储器的实现(一)中描述了一种可以记住输入端变化的装置。现需要对其功能进行扩充,我们将上面的开关定义为置位,下面的开关定义为复位,然后需要增加一个保持位,当保...

FAT_mt
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部