java解析xml 忽略dtd_转载: 使用dom4j解析XML时候忽略DTD文件

情景切入: 最近学校老师布置一个小作业,要求使用dom4j将xml文件转换成project.properties配置文件和Excel表格: 如XML文件: 三国

官方包下载地址:

http://www.dom4j.org/download.html

转载:

http://www.blogjava.net/rain1102/archive/2009/09/07/290063.html

当你用domj读取一个有dtd验证的xml文件,同时你的网络是不通的情况下。会出现以下错误:

Caused by:

org.dom4j.DocumentException: www.bea.com Nested exception: www....com

at org.dom4j.io.SAXReader.read(SAXReader.java:484)

at org.dom4j.io.SAXReader.read(SAXReader.java:264)

参照: javaeye上另一文章方法:声明本地的dtd验证

hibernate.sourceforge.net Nested exception: hibern

http://cherryqq.iteye.com/blog/401862

处理方法:

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 2.0//EN"

"file:///F:/hibernate-test/classes/hibernate-mapping-2.0.dtd">

就可以了。

但这样很麻烦.

HTML-Hibernate-XML.netJava

其实我们的XML肯定是合法的,不需要验证。

而设置不需要验证,目录()[-] 目录 关键字Java解析xml解析xml四种方法DOMSAXJDOMDOM4jXPath 引言 一基础知识扫盲 二DOMSAXJDOMDOM4j简单使用介绍 三性能测试 四对比 五小插曲XPath 【目录】 一、【基础知识——扫盲】 二、【DOM、SAX、JDOM、DOM4j简单使用介绍】 三、【性能测只需要设置DocumentBuilderFactory.setValidating(false)

就可以达到效果了,但是解析器还是会读取DTD的,解决的方法是实现EntityResolver接口,具体代码如下:

import Java.io.ByteArrayInputStream;

import Java.io.IOException;

import org.xml.sax.EntityResolver;

import org.xml.sax.InputSource;

import org.xml.sax.SAXException;

public class IgnoreDTDEntityResolver implements EntityResolver {

@Override

public InputSource resolveEntity(String publicId, String systemId)

throws SAXException, IOException {

return new InputSource(

new ByteArrayInputStream(

"<?xml version='1.0' encoding='UTF-8'?>".getBytes()

));

}

}

然后设置SAXReader 对象如下:

SAXReader reader = new SAXReader();

reader.setEntityResolver(new IgnoreDTDEntityResolver());

就行了

HTML-Hibernate-XML.netJava

另外一种方式为:

SAXReader xppReader = new SAXReader();

xppReader.setValidation(false);// 不验证xml文件内的dtd

xppReader.setEntityResolver(new EntityResolver() {

public InputSource resolveEntity(String publicId,

String systemId) throws SAXException, IOException {

InputStream stream = XmlUtil.class.getClassLoader().getResourceAsStream("***.dtd");

InputSource is = new InputSource(stream);

is.setPublicId(publicId);

is.setSystemId(systemId);

return is;

}

});

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值