spring解析XML,SAX首先读取该XML文件上的声明,根据声明去寻找相应的DTD定义,以便对文档做验证。默认的寻找规则是通过网络(声明的DTD的URL地址)来下载相应的DTD声明,并进行验证。由于出于网络的原因,spring提供了一个自定义寻找DTD/XSD声明的方式。
spring解析XML的代码:
protected Document doLoadDocument(InputSource inputSource, Resource resource) throws Exception { return this.documentLoader.loadDocument(inputSource, getEntityResolver(), this.errorHandler, getValidationModeForResource(resource), isNamespaceAware()); }
public interface EntityResolver { InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException; }
spring使用DelegatingEntityResolver实现类来解析XML的自定义声明
public InputSource resolveEntity(@Nullable String publicId, @Nullable String systemId) throws SAXException, IOException { if (systemId != null) { if (systemId.endsWith(DTD_SUFFIX)) { return this.dtdResolver.resolveEntity(publicId, systemId); } else if (systemId.endsWith(XSD_SUFFIX)) { return this.schemaResolver.resolveEntity(publicId, systemId); } } // Fall back to the parser's default behavior. return null; }
一、读取XSD
参数值:
publicId=null
systemId=http://www.springframework.org/schema/beans/spring-beans.xsd
加载机制是在META-INF/Spring.schemas文件中systemId对应的xsd
二、读取DTD
参数:
publicId=- // Spring //DTD BEAN 2.0 // EN
systemId=http: // www.springframework.org/dtd/Spring-beans-2.0.dtd
加载机制是截取systemId的Spring-beans-2.0.dtd取当前路径下寻找