Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解析字符串XML文档时的NOROUTETHOSTEException_Java_Xml_Xml Parsing_Remote Access - Fatal编程技术网

Java 解析字符串XML文档时的NOROUTETHOSTEException

Java 解析字符串XML文档时的NOROUTETHOSTEException,java,xml,xml-parsing,remote-access,Java,Xml,Xml Parsing,Remote Access,我正在从远程位置获取XML文档。此文档将作为字符串返回。之后,我尝试用JavaXML解析器解析字符串。但是,有时解析会使用java.net.NoRouteToHostException中止 我想知道异常究竟从何而来,因为据我所知,在抛出异常时我使用的是字符串,而不是需要连接的流或任何其他数据格式。讽刺的是,在异常捕获中,整个字符串的打印没有任何问题 呼叫代码: javax.xml.parsers.DocumentBuilder build = DocumentBuilderFactory.new

我正在从远程位置获取XML文档。此文档将作为字符串返回。之后,我尝试用JavaXML解析器解析字符串。但是,有时解析会使用
java.net.NoRouteToHostException
中止

我想知道异常究竟从何而来,因为据我所知,在抛出异常时我使用的是字符串,而不是需要连接的流或任何其他数据格式。讽刺的是,在异常捕获中,整个字符串的打印没有任何问题

呼叫代码:

javax.xml.parsers.DocumentBuilder build = DocumentBuilderFactory.newInstance().newDocumentBuilder();
...

try{
    String deploymentDescriptor = (String) getRemoteDeploymentDescriptor(webModule);
    org.w3c.dom.Document doc = build.parse( new ByteArrayInputStream( deploymentDescriptor.getBytes() ) );
    ...

} catch(Exception e){
    log.error("Could not parse document '" + deploymentDescriptor + "', e);
}
[14.07.14 16:06:17:157 CEST] Could not parse document '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" "http://java.sun.com/dtd/application_1_3.dtd">
<application>
</application>'
                            java.net.NoRouteToHostException: Keine Route zum Zielrechner
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:381)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:243)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:230)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:377)
at java.net.Socket.connect(Socket.java:539)
at java.net.Socket.connect(Socket.java:488)
at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:401)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:536)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:240)
at sun.net.www.http.HttpClient.New(HttpClient.java:313)
at sun.net.www.http.HttpClient.New(HttpClient.java:330)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:982)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:923)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:848)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1184)
at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.startDTDEntity(Unknown Source)
at org.apache.xerces.impl.XMLDTDScannerImpl.setInputSource(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at <my calling code, line "build.parse(...)">
日志条目:

javax.xml.parsers.DocumentBuilder build = DocumentBuilderFactory.newInstance().newDocumentBuilder();
...

try{
    String deploymentDescriptor = (String) getRemoteDeploymentDescriptor(webModule);
    org.w3c.dom.Document doc = build.parse( new ByteArrayInputStream( deploymentDescriptor.getBytes() ) );
    ...

} catch(Exception e){
    log.error("Could not parse document '" + deploymentDescriptor + "', e);
}
[14.07.14 16:06:17:157 CEST] Could not parse document '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" "http://java.sun.com/dtd/application_1_3.dtd">
<application>
</application>'
                            java.net.NoRouteToHostException: Keine Route zum Zielrechner
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:381)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:243)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:230)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:377)
at java.net.Socket.connect(Socket.java:539)
at java.net.Socket.connect(Socket.java:488)
at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:401)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:536)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:240)
at sun.net.www.http.HttpClient.New(HttpClient.java:313)
at sun.net.www.http.HttpClient.New(HttpClient.java:330)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:982)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:923)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:848)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1184)
at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.startDTDEntity(Unknown Source)
at org.apache.xerces.impl.XMLDTDScannerImpl.setInputSource(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at <my calling code, line "build.parse(...)">
[14.07.14 16:06:17:157 CEST]无法分析文档的
'
java.net.NoRouteToHostException:Keine Route zum Zieltechner
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:381)
位于java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:243)
位于java.net.PlainSocketImpl.connect(PlainSocketImpl.java:230)
位于java.net.socksocketimpl.connect(socksocketimpl.java:377)
位于java.net.Socket.connect(Socket.java:539)
位于java.net.Socket.connect(Socket.java:488)
位于sun.net.NetworkClient.doConnect(NetworkClient.java:175)
位于sun.net.www.http.HttpClient.openServer(HttpClient.java:401)
位于sun.net.www.http.HttpClient.openServer(HttpClient.java:536)
http.HttpClient.(HttpClient.java:240)
http.HttpClient.New(HttpClient.java:313)
http.HttpClient.New(HttpClient.java:330)
位于sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:982)
位于sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:923)
位于sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:848)
位于sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1184)
位于org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(未知源)
位于org.apache.xerces.impl.XMLEntityManager.startenty(未知来源)
位于org.apache.xerces.impl.XMLEntityManager.startdentity(未知源)
位于org.apache.xerces.impl.xmldtddscannerimpl.setInputSource(未知源)
在org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(未知来源)
位于org.apache.xerces.impl.XMLDocumentFragmentScanneImpl.ScandDocument(未知来源)
位于org.apache.xerces.parsers.XML11Configuration.parse(未知源)
位于org.apache.xerces.parsers.XML11Configuration.parse(未知源)
位于org.apache.xerces.parsers.XMLParser.parse(未知源)
位于org.apache.xerces.parsers.DOMParser.parse(未知源)
位于org.apache.xerces.jaxp.DocumentBuilderImpl.parse(未知源)
位于javax.xml.parsers.DocumentBuilder.parse(未知源)
在
这怎么可能呢?我认为字符串总是完全保存在当前的操作系统中(与InputStreams相反,InputStreams可能确实会在中间的某个时间失去连接)。还是我的电话号码有问题


调用代码中的try-catch块针对同一远程位置的不同xml文件执行多次。它适用于大多数文件,但不是所有文件。当重复实验时,它总是不适用于相同的文件。但是,日志错误条目每次都能完美地打印整个文件。

这里的问题是,解析器试图解析XML文档中引用的文档类型定义。因此,即使XML文档已经加载,在处理文档时也会加载引用的DTD。“无主机路由”表示临时网络问题或网络配置问题

如果设置EntityResolver,则可以控制分辨率并处理错误,例如通过缓存DTD或从本地副本提供DTD。您还可以配置本地系统XML目录,使XML解析器不必从网络加载实体