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