2010-10-23 6 views
4

, когда я пытаюсь разобрать XML, я получаю следующее исключение: -Неизвестное исключение хоста при разборе файла XML

java.net.UnknownHostException: hibernate.sourceforge.net 
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at sun.net.NetworkClient.doConnect(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.http.HttpClient.<init>(Unknown Source) 
    at sun.net.www.http.HttpClient.New(Unknown Source) 
    at sun.net.www.http.HttpClient.New(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
    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) 

код, который я использую для разбора XML ниже: -

File hbmFile = new File(hbmFileName); 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document doc = db.parse(hbmFile); 

Я пытаюсь разобрать xml, который был написан для спящего режима, на самом деле это файл сопоставления спящего режима.

XML, что я пытаюсь разобрать ниже: -

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="org.hibernate.entity.Student" table="table_student"> 
     <id name="rollNo" column="rool_no" type="int"/> 
     <property name="name" column="st_name" type="string"/> 
     <set name="marks" table="table_marks"> 
      <key column="roll_no"/> 
      <composite-element class="org.hibernate.entity.StudentMarks"> 
       <property name="subject" column="st_sub"/> 
       <property name="marks" column="st_marks"/> 
      </composite-element> 
     </set> 
    </class> 
</hibernate-mapping> 

Пожалуйста, помогите.

+0

У нас такая же проблема сегодня, ответы здесь могут работать, но нет необходимости отключать проверку, потому что Hibernate может разрешать DTD локально (см. Этот [ответ] (https://stackoverflow.com/a/8731499/4436313).)). Моя ссылка DTD была неправильной: 'http: // hibernate.org' вместо' http: // www.hibernate.org'. – DaRich

ответ

2

я использовал следующий код, и это работает отлично для меня ..

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setValidating(false); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
db.setEntityResolver(new EntityResolver() { 
    @Override 
    public InputSource resolveEntity(String arg0, String arg1) 
     throws SAXException, IOException { 
    if(arg0.contains("Hibernate")) { 
     return new InputSource(new StringReader("")); 
    } else { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    } 
}); 
Document doc = db.parse(hbmFile); 
+0

У меня была такая же проблема, это действительно помогло мне :) – panschk

14

Парсер пытается загрузить DTD от hibernate.sourceforge.net, чтобы проверить проанализированный XML.

Однако DNS-клиент на компьютере не может разрешить это имя хоста по какой-либо причине (он разрешает штраф до 82.98.86.175 на моей машине).

Чтобы избежать этой проблемы, вы должны сказать DocumentBuilderFactory игнорировать DTD:

File hbmFile = new File(hbmFileName); 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 

dbf.setValidating(false); 
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 

DocumentBuilder db = dbf.newDocumentBuilder(); 
Document doc = db.parse(hbmFile); 

См Make DocumentBuilder.parse ignore DTD references.

+0

есть ли способ остановить парсер для загрузки DTD. –

+0

Да, есть. См. Мой обновленный ответ. –

+0

http://download.oracle.com/javase/1.5.0/docs/api/javax/xml/parsers/DocumentBuilderFactory.html#setValidating(boolean) – dvhh

0

Я также пытаюсь читать из XML-файла с ОТД тегом

<!DOCTYPE grammar PUBLIC "-//W3C//DTD GRAMMAR 1.0//EN" "http://www.w3.org/TR/speech-grammar/grammar.dtd"> 

и код

File fXmlFile = new File(grammarXML);     
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document doc = dBuilder.parse(fXmlFile); 

Я получал такую ​​же ошибку.

java.net.UnknownHostException: 

Сервер, на котором развернут код, не имеет доступа к w3.org. Когда я открываю w3.org в браузере, он открывает страницу с отключенным подключением. Я дал доступ к w3.org, и он решил проблему.

Смежные вопросы