`
popjxc
  • 浏览: 67551 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Freemarker解析有DTD的XML带来的问题

阅读更多
Freemarker的prase函数可以解析xml文件,将xml文档树解析为map结构,这样我们就可以用xml作为数据源了。这在Freemarker对xml文件的增量更新中用处很大。
但是当xml带有dtd校验时,如下一段xml文件:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
	"http://www.springframework.org/dtd/spring-beans.dtd">

<beans default-autowire="byName">
。。。

prase函数会去网络上下载DTD文件来对xml进行校验,如果拔掉网线,prase函数就会抛出异常,www.springframework.org未知域名。
因为涉及到网络通信,prase函数执行的会很慢。

去掉DTD校验解决方法:
可以到http://www.docjar.com/html/api/freemarker/ext/dom/NodeModel.java.html
查看prase函数的源代码。Freemarker并没有解决方法,那么只有重写NodeModel这个类了。

解决示例:
1. 重写prase函数
public abstract class NodeModelWithoutDtd extends NodeModel {

	protected NodeModelWithoutDtd(Node node) {
		super(node);
	}

	public static NodeModel parse(InputSource is) throws SAXException,
			IOException, ParserConfigurationException {
		return parse(is, true, true);
	}

	public static NodeModel parse(InputSource is, boolean removeComments,
			boolean removePIs) throws SAXException, IOException,
			ParserConfigurationException {
		DocumentBuilder builder = getDocumentBuilderFactory()
				.newDocumentBuilder();
		
		//设置成空的DTD校验
		NullEntityResolver nullEntityResolver = new NullEntityResolver();
		builder.setEntityResolver(nullEntityResolver);
		Document doc = builder.parse(is);
		
		if (removeComments && removePIs) {
			NodeModel.simplify(doc);
		}
		else {
			if (removeComments)
				NodeModel.removeComments(doc);
			if (removePIs)
				NodeModel.removePIs(doc);
			
			NodeModel.mergeAdjacentText(doc);
		}
		
		return NodeModel.wrap(doc);
	}
}


2. 空DTD校验类
public class NullEntityResolver implements EntityResolver {

	static String emptyDtd = "";

    static ByteArrayInputStream byteIs = new ByteArrayInputStream(emptyDtd.getBytes());

    public InputSource resolveEntity(String publicId, String systemId) 
                              throws SAXException, IOException {
        return new InputSource(byteIs);
    }

}



然后用NodeModelWithoutDtd.prase("")就可以了~
分享到:
评论

相关推荐

    struts2 XML dtd

    - 验证:通过DTD,XML解析器可以验证配置文件是否符合规范,避免语法错误。 - 文档化:DTD提供了一种方式来说明配置文件的结构,帮助开发者理解每个元素和属性的用途。 - 可维护性:随着Struts2版本的更新,DTD的...

    ftl排版-xml格式化.zip

    在“ftl排版-xml格式化.zip”这个压缩包中,我们有“foxe_241_zwm”这个文件,这很可能是一个名为Foxe的FTL编辑器或XML查看器的版本,版本号可能是241,而“zwm”可能是某种特定的配置或标识。 XML是一种标记语言,...

    JSP and XML

    4. **结构化数据**:XML文档必须有严格的结构,便于解析和验证。 5. **DTD(Document Type Definition)或XSD(XML Schema Definition)**:用于定义XML文档的结构和数据类型,确保数据的有效性和一致性。 **JSP和...

    notepad++.rar

    其XML插件支持XML Schema(XSD)和DTD文档,可以在编辑过程中实时检查XML文档的合规性,确保数据的准确无误。 其次,Notepad++的“比较”功能在处理多个XML文件时尤其有用,可以快速对比不同版本间的差异,便于追踪...

    Struts2手动搭建所有的jar包及相应的struts.xml和web.xml

    现在,当用户访问匹配Action的URL时,Struts2框架会解析`struts.xml`文件中的配置,执行对应的Action,然后根据结果类型返回相应的视图。你可以在此基础上扩展配置,比如添加更多的Action、结果类型、拦截器,以满足...

    struts.xml详解.doc

    第一行的DOCTYPE声明指定了Struts2配置的DTD(文档类型定义),它告诉解析器如何解析XML文件。这里使用的DTD是Struts 2.0版本的。 2. **struts标签**: `&lt;struts&gt;`是整个配置文件的根元素,所有其他配置都包含在...

    spring boot + mybatis xml + jsp

    现在我们将深入探讨如何在Spring Boot项目中集成MyBatis的XML配置,并支持JSP视图解析。 首先,为了在Spring Boot项目中引入MyBatis,我们需要在`pom.xml`文件中添加MyBatis及其依赖,包括Spring Boot对MyBatis的...

    MyEclipse8下struts2开发例程及解析1.doc

    ### MyEclipse 8 下 Struts 2 开发例程及解析 #### 一、环境配置与准备 本文档旨在详细介绍如何在 MyEclipse 8 环境中搭建并使用 Struts 2 框架进行开发。尽管市面上有很多关于 MyEclipse 和 Struts 的资源,但...

    JAVA面试题集 (含一些jsp,xml,J2EE,MVC)

    Java面试题集是一个涵盖广泛的资源,它包含了与Java编程、JSP、XML、J2EE以及MVC相关的面试问题和答案。这些主题都是IT行业中Java开发者必须掌握的关键知识点,因此对于求职者或希望提升技能的开发者来说至关重要。...

    struts2总结

    - **DTD引用**:在`struts.xml`中,DTD(文档类型定义)用于验证配置文件的语法,但有时可能会遇到网络问题导致无法访问。为解决此问题,可以下载所需的DTD文件到本地,并在MyEclipse的XML Catalog设置中指定本地...

    金蝶全渠道二开帮助文档.docx

    - 使用IDE的提示功能,根据引入的DTD文件,可以便捷地完成XML标签和属性的编写。 - 系统解析XML并结合Freemarker模板生成动态HTML,从而动态渲染用户界面。 - 通过插件机制,可以扩展和定制页面功能,例如处理...

    Struts 2 配置文件

    ### struts.xml文件结构解析 struts.xml文件的结构遵循XML的语法规则,其根元素为`&lt;struts&gt;`,该元素包含了框架运行所需的各种配置信息。以下是对struts.xml文件各主要元素的详细解析: 1. **DTD声明**:文件顶部...

    Struts2教程

    - **dom4j-1.6.1.jar**:DOM解析工具,用于XML文件的解析。 - **commons-io-1.3.2.jar**:提供了大量的IO操作工具类,简化IO操作。 - **struts2-core-2.1.6.jar**:Struts2的核心库,包含Struts2框架的主要功能...

    struts框架搭建

    - **问题描述**:在断网环境下,IDEA中的`struts.xml`文件会出现红色叹号,无法获取到DTD验证信息,导致无法获得提示。 - **解决方法**: 1. **定位DTD文件**:在Struts2源码包中找到`struts-2.0.dtd`文件。 2. **...

    struts-2.1.8.1-all.zip完整jar包

    - **struts-2.1.7.dtd、struts-2.1.dtd、struts-2.0.dtd**:这些是DTD(Document Type Definition)文件,定义了Struts配置文件的结构和规则,帮助XML解析器验证struts.xml的正确性。 - **struts2-dojo-plugin-2.1...

    专题资料(2021-2022年)Hipay系统自助终端页面开发流程和规范06版.doc

    - Widget的XML描述应符合指定DTD文件,如`framework/widget/dtd`下的xsd文件,确保页面和脚本的正确绑定。 - 注释的使用应规范,如图(10)所示,提供清晰的代码解释。 综上所述,Hipay系统自助终端页面的开发...

Global site tag (gtag.js) - Google Analytics