Java的SchemaFactory是否会从w3.org获取XML Schema?
XML Schema验证的网络请求疑问及解决方案
问题核心解答
- 你给出的代码里,
XMLConstants.W3C_XML_SCHEMA_NS_URI只是用来指定SchemaFactory要遵循的W3C XML Schema(XSD)规范标准,并不是要从这个URI对应的网络地址拉取Schema文件。 - 主流JDK(Oracle JDK、OpenJDK)的XML处理库中,W3C的核心XMLSchema(即
http://www.w3.org/2001/XMLSchema对应的Schema)是预先嵌入在库中的,验证过程中不会主动发起网络请求去获取它。 - 例外情况:如果你的本地XSD文件通过
xs:import或xs:include引用了外部网络上的Schema资源,验证器默认会尝试去网络拉取这些依赖资源,这时候才会产生网络请求。 - 补充说明:不同的SchemaFactory第三方实现可能存在行为差异,但JDK内置的标准实现都遵循“内置核心Schema,不主动发起网络请求”的逻辑。
彻底避免网络请求的方案
如果要完全杜绝验证时的网络请求,可以从以下两点入手:
- 本地化所有依赖Schema:把本地XSD中引用的所有外部网络Schema下载到本地,修改XSD里的引用路径为本地文件路径或项目classpath路径。
- 自定义EntityResolver拦截请求:给Validator设置自定义的EntityResolver,当验证器尝试解析外部资源时,直接从本地返回对应内容,避免走网络。示例代码:
validator.setEntityResolver(new EntityResolver() { @Override public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { // 根据目标Schema的systemId匹配本地文件 if ("http://www.w3.org/2001/XMLSchema".equals(systemId)) { return new InputSource(new FileInputStream("本地存储的XMLSchema.xsd路径")); } // 其他外部依赖资源同理处理 return null; } });
内容的提问来源于stack exchange,提问作者user2852699
相关产品推荐
相关产品推荐

