CF2021中xmlParse返回WDDX编码对象异常及DTD路径设置疑问
问题解答
1. xmlParse返回WDDX编码对象的原因
当CF2021的xmlParse()处理带有DTD引用但无法找到对应DTD文件的XML时,解析流程触发非致命错误。CF2021在此场景下的错误 fallback 逻辑和CF2018不同:它既不直接抛出解析错误,也不忽略DTD继续解析XML,而是把原始XML内容以字符串形式封装进WDDX格式对象中返回,这就导致你需要额外的转换步骤才能拿到预期的XML对象。
2. 可以设置CF查找DTD文件的默认目录,两种可行方案:
- 全局配置(ColdFusion管理员)
登录CF管理员后台,进入「服务器设置 > 设置和内存」,找到「DTD路径」选项,填入存放DTD文件的目录路径(支持绝对路径或相对于CF根目录的路径)。保存后,CF会优先在该目录下查找XML中引用的DTD文件。 - 代码层自定义实体解析器(局部生效)
如果不想修改全局配置,可在调用xmlParse()前自定义实体解析器,指定DTD的查找路径。示例代码:
这种方式仅对当前解析逻辑生效,不会影响全局的DTD查找规则。<cfscript> // 自定义实体解析函数,指定DTD文件路径 function customEntityResolver(publicId, systemId) { // 替换为你的DTD文件存放目录 var dtdDir = "/opt/cfusion/dtds/"; var dtdFileName = listLast(systemId, "/"); return createObject("java", "java.io.FileInputStream").init(dtdDir & dtdFileName); } // 配置XML解析器 xmlFactory = createObject("java", "javax.xml.parsers.DocumentBuilderFactory").newInstance(); xmlFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", true); xmlBuilder = xmlFactory.newDocumentBuilder(); xmlBuilder.setEntityResolver(createObject("java", "coldfusion.runtime.CFEntityResolver").init(customEntityResolver)); // 用自定义解析器解析XML文件 xmlDoc = xmlBuilder.parse("/path/to/your/xml/file.xml"); cfXmlObj = xmlParse(xmlDoc); </cfscript>
内容的提问来源于stack exchange,提问作者Joshua Sharf
相关产品推荐
相关产品推荐

