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("")就可以了~
分享到:
相关推荐
- 验证:通过DTD,XML解析器可以验证配置文件是否符合规范,避免语法错误。 - 文档化:DTD提供了一种方式来说明配置文件的结构,帮助开发者理解每个元素和属性的用途。 - 可维护性:随着Struts2版本的更新,DTD的...
在“ftl排版-xml格式化.zip”这个压缩包中,我们有“foxe_241_zwm”这个文件,这很可能是一个名为Foxe的FTL编辑器或XML查看器的版本,版本号可能是241,而“zwm”可能是某种特定的配置或标识。 XML是一种标记语言,...
4. **结构化数据**:XML文档必须有严格的结构,便于解析和验证。 5. **DTD(Document Type Definition)或XSD(XML Schema Definition)**:用于定义XML文档的结构和数据类型,确保数据的有效性和一致性。 **JSP和...
其XML插件支持XML Schema(XSD)和DTD文档,可以在编辑过程中实时检查XML文档的合规性,确保数据的准确无误。 其次,Notepad++的“比较”功能在处理多个XML文件时尤其有用,可以快速对比不同版本间的差异,便于追踪...
现在,当用户访问匹配Action的URL时,Struts2框架会解析`struts.xml`文件中的配置,执行对应的Action,然后根据结果类型返回相应的视图。你可以在此基础上扩展配置,比如添加更多的Action、结果类型、拦截器,以满足...
第一行的DOCTYPE声明指定了Struts2配置的DTD(文档类型定义),它告诉解析器如何解析XML文件。这里使用的DTD是Struts 2.0版本的。 2. **struts标签**: `<struts>`是整个配置文件的根元素,所有其他配置都包含在...
现在我们将深入探讨如何在Spring Boot项目中集成MyBatis的XML配置,并支持JSP视图解析。 首先,为了在Spring Boot项目中引入MyBatis,我们需要在`pom.xml`文件中添加MyBatis及其依赖,包括Spring Boot对MyBatis的...
### MyEclipse 8 下 Struts 2 开发例程及解析 #### 一、环境配置与准备 本文档旨在详细介绍如何在 MyEclipse 8 环境中搭建并使用 Struts 2 框架进行开发。尽管市面上有很多关于 MyEclipse 和 Struts 的资源,但...
Java面试题集是一个涵盖广泛的资源,它包含了与Java编程、JSP、XML、J2EE以及MVC相关的面试问题和答案。这些主题都是IT行业中Java开发者必须掌握的关键知识点,因此对于求职者或希望提升技能的开发者来说至关重要。...
- **DTD引用**:在`struts.xml`中,DTD(文档类型定义)用于验证配置文件的语法,但有时可能会遇到网络问题导致无法访问。为解决此问题,可以下载所需的DTD文件到本地,并在MyEclipse的XML Catalog设置中指定本地...
- 使用IDE的提示功能,根据引入的DTD文件,可以便捷地完成XML标签和属性的编写。 - 系统解析XML并结合Freemarker模板生成动态HTML,从而动态渲染用户界面。 - 通过插件机制,可以扩展和定制页面功能,例如处理...
### struts.xml文件结构解析 struts.xml文件的结构遵循XML的语法规则,其根元素为`<struts>`,该元素包含了框架运行所需的各种配置信息。以下是对struts.xml文件各主要元素的详细解析: 1. **DTD声明**:文件顶部...
- **dom4j-1.6.1.jar**:DOM解析工具,用于XML文件的解析。 - **commons-io-1.3.2.jar**:提供了大量的IO操作工具类,简化IO操作。 - **struts2-core-2.1.6.jar**:Struts2的核心库,包含Struts2框架的主要功能...
- **问题描述**:在断网环境下,IDEA中的`struts.xml`文件会出现红色叹号,无法获取到DTD验证信息,导致无法获得提示。 - **解决方法**: 1. **定位DTD文件**:在Struts2源码包中找到`struts-2.0.dtd`文件。 2. **...
- **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...
- Widget的XML描述应符合指定DTD文件,如`framework/widget/dtd`下的xsd文件,确保页面和脚本的正确绑定。 - 注释的使用应规范,如图(10)所示,提供清晰的代码解释。 综上所述,Hipay系统自助终端页面的开发...