禁用基于外部 DTD/XSD 的 XML 验证
有没有办法在不修改源代码(构建 DocumentBuilder 的库)的情况下禁用基于外部 DTD/XSD 的 XML 验证?比如为 DocumentBuilderFactory 功能设置 JVM 范围的默认值,以及为 SAX 设置相同的默认值?
在 IDE 中编辑文件时,验证非常有用,但我不需要仅仅因为 somelib.net 出现故障而导致我的 web 应用程序无法启动。
我知道我可以指定本地 DTD/XSD 位置,但这是一个不方便的解决方法。
有哪些选择?我能想到两个:
- 实现我自己的 DocumentBuilderFactory。
- 拦截Xerces的DocumentBuilderImpl的构建并修改
features
Hashtable(添加http://apache.org/xml/features/nonvalidating/load-external-dtd
)。
Is there a way to disable XML validation based on external DTD/XSD without modifications to the source code (of the libraries that construct DocumentBuilder)? Something like setting JVM-wide defaults for DocumentBuilderFactory features, and the same for SAX?
Validation is great when editing files in IDE, but I don't need my webapp failing to start just because somelib.net went down.
I know I can specify local DTD/XSD locations, but that's an inconvenient workaround.
What are the options? I can think of two:
- Implement my own DocumentBuilderFactory.
- Intercept construction of Xerces's DocumentBuilderImpl and modify the
features
Hashtable (addhttp://apache.org/xml/features/nonvalidating/load-external-dtd
).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
禁用验证可能不会阻止处理器获取 DTD,因为它仍然可能这样做,以便使用 DTD 中存在的属性默认值等(它将放置在树中),即使它没有进行实际的验证 违反 DTD 的语法。
处理 XML 文档时防止网络活动的一种技术是使用“空白解析器”,如下所示:
然后在处理之前进行设置,如下所示:
然后您还可以确保正在处理的文档没有被任何信息更改来自 DTD.y
Disabling validation may not prevent a processor from fetching a DTD, as it still may do so in order to use attribute defaults etc. present in the DTD (which it will place in the tree), even if it does no actual validation against the DTD's grammar.
One technique to prevent network activity when processing an XML document is to use a "blanking resolver" like this:
and then set this prior to processing like this:
You will then also be sure that the document being processed has not been altered by any information from the DTD.y