`

Java解析xml禁止校验dtd

    博客分类:
  • Java
阅读更多

今天在做log4j.xml解析的时候,指定了如下的dtd声明:

 

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

不过在应用的启动过程中,由于log4j.xml被替换至一个临时目录下,而log4j.dtd没有被跟随拷贝过去,导致解析log4j配置的过程中,抛出了如下的异常信息:

 

2011-04-27 21:27:03.407:WARN::Nested in org.springframework.beans.factory.BeanCreationException: Error creating bean with name
.......
java.io.FileNotFoundException: C:\Users\lanbo.xj\AppData\Local\Temp\hsf_jetty_placeholder\log4j.dtd (系统找不到指定的文件。)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(FileInputStream.java:106)
	at java.io.FileInputStream.<init>(FileInputStream.java:66)
......

当解析xml文件时,如果xml文件中引用了dtd文件,解析的时候读不到这个dtd文件,无论解析是否设置验证,都会抛出这样的异常。

所以想到要在解析xml时,禁止校验DTD文件。

我在参考了

1). xml解析忽略dtd文件

2). java解析xml禁止校验dtd

之后,修改了解析XML的代码,我是用DocumentBuilder做解析的,代码如下:

private Document getDocument(String configFile) throws ParserConfigurationException, SAXException, IOException {
	dbf = DocumentBuilderFactory.newInstance();
	db = dbf.newDocumentBuilder();
	db.setEntityResolver(new IgnoreDTDEntityResolver());
	return db.parse(new File(configFile));
}

class IgnoreDTDEntityResolver implements EntityResolver {
	@Override
	public InputSource resolveEntity(String arg0, String arg1) throws SAXException, IOException {
		 return new InputSource(new ByteArrayInputStream("<?xml version='1.0' encoding='UTF-8'?>".getBytes())); 
	}
}

 经上述修改后,问题解决。

 

PS:刚了解到一个情况,与上述文章无关,但碍于另写一篇,就放置于此文之后:

 

想了解下log4j中log4j.properties和log4j.xml的加载顺序,经过查看LogManager.java

// if the user has not specified the log4j.configuration
// property, we search first for the file "log4j.xml" and then
// "log4j.properties"

明确了,当用户没有设置log4j.configuration属性,则首先查找log4j.xml,然后查找log4j.properties。

log4j.properties以后已经不再推荐使用了。

 

分享到:
评论

相关推荐

    xml的JAVA解析与格式定义

    解析器的介绍 文档对象模型(DOM)解析实例 SAX解析实例 DOM4J解析实例 JDOM解析实例 JAVA操纵XML 实例讲解

    JavaXML解析器FastXml.zip

    FastXml类似XMLPULL一样,不校验文档schema和DTD,对文档的格式也不进行非常严格的校验:通常xml文档的格式都是正确的,当我们追求xml解析的最高性能时,就不需要对格式等内容进行及其严格的校验了。FastXml并不...

    day023-xml解析笔记和代码.rar

    由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便, 结合XPATH就可以直接获取到某个元素 使用dom4j支持xpath的操作的几种主要形式 第一种形式 /a/b/c: 表示一层...

    XMLParseToTree:带有 GUI 的 XML 解析器,然后将其转换为树

    This is a Java Project used to parse XML files ( and probably ...一个用来将xml文件(和DTD文件,可选)可视化的工具,也就是将提供的XML文件转化为树的形式,同时提供XML校验机制(也就是当XML出现错误时,告知错误

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    超级有影响力霸气的Java面试题大全文档

    超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

    Spring 2.0 开发参考手册

    2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性...

    Spring-Reference_zh_CN(Spring中文参考手册)

    2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 ...

    spring chm文档

    2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. ...

    Spring API

    2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 ...

    Spring中文帮助文档

    2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 ...

Global site tag (gtag.js) - Google Analytics