2014-07-14 2 views
0

원격 위치에서 XML 문서를 가져옵니다. 이 문서는 문자열로 반환됩니다. 그런 다음 java xml 파서로 String을 구문 분석하려고합니다. 그러나 때로는 구문 분석이 java.net.NoRouteToHostException으로 중단됩니다.String XML 문서를 구문 분석 할 때 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(...)"> 

가 가능합니까? 문자열은 항상 현재 운영 체제에서 완전히 저장되었다고 생각합니다 (실제로 중간에 연결이 끊길 수있는 InputStream과는 반대). 아니면 내 전화 코드에서 잘못된 일을하고 있는가?

호출 코드의 try-catch 블록은 동일한 원격 위치의 여러 xml 파일에 대해 여러 번 실행됩니다. 대부분의 파일에는 작동하지만 전부는 아닙니다. 실험을 반복 할 때 항상 작동하지 않는 파일과 같습니다. 그러나 로그 오류 항목은 매번 전체 파일을 완벽하게 인쇄합니다.

답변

1

여기서 문제는 파서가 XML 문서에서 참조하는 문서 형식 정의를 해결하려고 시도한다는 것입니다. 따라서 XML 문서가 이미로드되어 있어도 참조 된 DTD는 문서가 처리 될 때로드됩니다. "호스트 경로 없음"은 임시 네트워크 문제 또는 네트워크 구성 문제를 나타냅니다.

EntityResolver를 설정하면 해상도를 제어하고 오류를 처리 할 수 ​​있습니다. DTD를 캐싱하거나 로컬 사본에서 DTD를 제공함으로써. 로컬 시스템 XML 카탈로그를 구성하여 XML 파서가 네트워크에서 엔터티를로드하지 못하게 할 수도 있습니다.

+0

대단히 감사합니다! 그것은 그 문제를 해결했습니다. – subrunner