解析xml文件时出现未知主机异常

时间:2022-12-01 11:00:00

when i am trying to parse an xml, i am getting following exception :-

当我试图解析一个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)

The code that i am using to parse the xml is below:-

我用来解析xml的代码如下: -

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

i am trying to parse the xml that has been written for hibernate, actually it is a hibernate mapping file.

我试图解析为hibernate编写的xml,实际上它是一个hibernate映射文件。

The xml that i am trying to parse is below:-

我想解析的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>

Please help.

请帮忙。

3 个解决方案

#1


14  

The parser is trying to download the DTD from hibernate.sourceforge.net in order to validate the parsed XML.

解析器正在尝试从hibernate.sourceforge.net下载DTD以验证解析的XML。

However, the DNS client on the machine can't resolve that host name for some reason (it resolves fine to 82.98.86.175 on my machine).

但是,计算机上的DNS客户端由于某种原因无法解析该主机名(它在我的计算机上解析为82.98.86.175)。

To avoid this problem, you have to tell the DocumentBuilderFactory to ignore the DTD:

要避免此问题,您必须告诉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);

See Make DocumentBuilder.parse ignore DTD references.

请参阅使DocumentBuilder.parse忽略DTD引用。

#2


2  

i used the following code and this is working fine for me..

我使用以下代码,这对我来说很好..

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);

#3


0  

I am also trying read from a xml file with dtd tag

我也尝试从带有dtd标签的xml文件中读取

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

and code

和代码

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

I was getting the same error.

我得到了同样的错误。

java.net.UnknownHostException:

The server where the code is deployed does not have access to w3.org. When i open w3.org in a browser, it is opening connection timed out page. I gave access to w3.org and it solved the issue.

部署代码的服务器无权访问w3.org。当我在浏览器中打开w3.org时,它打开连接超时页面。我访问了w3.org并解决了这个问题。

#1


14  

The parser is trying to download the DTD from hibernate.sourceforge.net in order to validate the parsed XML.

解析器正在尝试从hibernate.sourceforge.net下载DTD以验证解析的XML。

However, the DNS client on the machine can't resolve that host name for some reason (it resolves fine to 82.98.86.175 on my machine).

但是,计算机上的DNS客户端由于某种原因无法解析该主机名(它在我的计算机上解析为82.98.86.175)。

To avoid this problem, you have to tell the DocumentBuilderFactory to ignore the DTD:

要避免此问题,您必须告诉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);

See Make DocumentBuilder.parse ignore DTD references.

请参阅使DocumentBuilder.parse忽略DTD引用。

#2


2  

i used the following code and this is working fine for me..

我使用以下代码,这对我来说很好..

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);

#3


0  

I am also trying read from a xml file with dtd tag

我也尝试从带有dtd标签的xml文件中读取

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

and code

和代码

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

I was getting the same error.

我得到了同样的错误。

java.net.UnknownHostException:

The server where the code is deployed does not have access to w3.org. When i open w3.org in a browser, it is opening connection timed out page. I gave access to w3.org and it solved the issue.

部署代码的服务器无权访问w3.org。当我在浏览器中打开w3.org时,它打开连接超时页面。我访问了w3.org并解决了这个问题。