pom.xml
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
</dependency>
Je veux lire le fichier xml avec le fichier DTD externe spécifié comme ci-dessous avec ʻorg.dom4j.io.SAXReader`. Cependant, je souhaite le charger dans un environnement hors ligne.
struts-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
...
</struts-config>
Lorsque j'ai exécuté le code suivant dans un environnement hors ligne, j'ai obtenu une ʻUnknownHostException`.
Bad.java
SAXReader reader = new SAXReader();
Document doc = reader.read("struts-config.xml");
Exception
org.dom4j.DocumentException: jakarta.apache.org Nested exception: jakarta.apache.org
at org.dom4j.io.SAXReader.read(SAXReader.java:484)
at org.dom4j.io.SAXReader.read(SAXReader.java:321)
at test2.Test2.main(Test2.java:24)
Nested exception:
java.net.UnknownHostException: jakarta.apache.org
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
~~~
La cause est que le fichier dtd spécifié dans la déclaration DOCTYPE ne peut pas être lu. La solution était de ne pas lire le fichier DTD externe.
Good.java
SAXReader reader = new SAXReader();
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
Document doc = reader.read("struts-config.xml");
https://xerces.apache.org/xerces2-j/features.html http://qiita.com/yoshi389111/items/3d0da72b1f2ccd947052 http://k-motohashi.hatenablog.com/entry/2013/04/24/115413
Recommended Posts