jdom解析xml文档,如何略过远程外部dtd下载

时间:2022-09-16 22:27:41
<?xml encoding="UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "-//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

用java下的dom解析器解析的时候,每次都要下载http://jasperreports.sourceforge.ne...asperreport.dtd
结果连不上,抛出IOException,从而XML文件也无法解析。
我用jdom和xerces两者都试过,没办法略过dtd下载。

有什么办法在这个dtd下载失败的情况下,仍继续解析文档,只不过不做dtd合法验证而已。

5 个解决方案

#1


call 

SAXBuilder builder = 
        new SAXBuilder("org.apache.xerces.parsers.SAXParser", true);
...
builder.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

Document doc = builder.build(new FileInputStream(file));

#2


这个方法已经试过了。
builder.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
这句起的作用是不用dtd对xml文档进行验证,但是还要 load dtd文档,在网路不通的情况下,抛出IO异常。

#3


up

#4



builder.setEntityResolver(new NoOpEntityResolver());


see
http://www.jdom.org/docs/faq.html#a0350

#5


两个特性都要设,在b9版本上使用org.apache.xerces.parsers.SAXParser通过。
前者是要不要装载,后者是要不要验证,如果后者为true,前者就没有意义了,都会去装载。
builder.setFeature(
    "http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
builder.setFeature(
    "http://xml.org/sax/features/validation",false);

#1


call 

SAXBuilder builder = 
        new SAXBuilder("org.apache.xerces.parsers.SAXParser", true);
...
builder.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

Document doc = builder.build(new FileInputStream(file));

#2


这个方法已经试过了。
builder.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
这句起的作用是不用dtd对xml文档进行验证,但是还要 load dtd文档,在网路不通的情况下,抛出IO异常。

#3


up

#4



builder.setEntityResolver(new NoOpEntityResolver());


see
http://www.jdom.org/docs/faq.html#a0350

#5


两个特性都要设,在b9版本上使用org.apache.xerces.parsers.SAXParser通过。
前者是要不要装载,后者是要不要验证,如果后者为true,前者就没有意义了,都会去装载。
builder.setFeature(
    "http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
builder.setFeature(
    "http://xml.org/sax/features/validation",false);