gpt4 book ai didi

java - 解析字符串 XML 文档时出现 NoRouteToHostException

转载 作者:行者123 更新时间:2023-12-01 12:45:31 25 4
gpt4 key购买 nike

我正在从远程位置获取 XML 文档。该文档以字符串形式返回。之后,我尝试使用 java xml 解析器解析该字符串。然而,有时解析会因 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(...)">

这怎么可能?我认为字符串总是完全保存在当前操作系统中(与InputStreams相反,InputStreams确实可能在中间的某个时间失去连接)。或者我在调用代码中做错了什么?

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

最佳答案

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

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

关于java - 解析字符串 XML 文档时出现 NoRouteToHostException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24740626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com