dtd文件是用于验证xml的正确性的,就是xml所有节点及值都在dtd文件中有所规定,不能超出dtd定义的范围,否则就会出现错误。
1) dtd在xml中的定义
我们首先来看一下struts的配置文件:struts-config.xml
<!DOCTYPE struts-config PUBLIC"-//Apache Software Foundation//DTD Struts Configuration1.2//EN""http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
2) dtd 的加载方式
a.网络加载,通过定义,如果不做任何处理,上面的配置将通过网络访问struts-config_1_2.dtd文件。
b.如果采用dom读取xml文件,可以通过设置实现解析器的方式将dtd的访问路径改为文件.
DocumentBuilder.setEntityResolver
例子:
private static void parse(InputStream in) throws Exception{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
db.setEntityResolver(new EntityResolver(){
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException{
for (int i = 0; i < registrations.length; i += 2) {
if(publicId.equals(registrations[i])){
String dtd_uri = registrations[i+1];
InputStream dtd_stream = this.getClass().getResourceAsStream(dtd_uri);
return new InputSource(dtd_stream);
}
}
return null;
}});
Document doc = db.parse(in);
Element root = doc.getDocumentElement();
NodeList nodes = root.getElementsByTagName("servlet-mapping");
int nodec = nodes.getLength();
for(int i=0;i<nodec;i++){
Element node = (Element)nodes.item(i);
Element servlet_name = (Element)node.getElementsByTagName("servlet-name").item(0);
Element url_pattern = (Element)node.getElementsByTagName("url-pattern").item(0);
String sn = servlet_name.getFirstChild().getNodeValue();
String up = url_pattern.getFirstChild().getNodeValue();
System.out.println(sn+"="+up);
}
}
private final static String registrations[] = {
"-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN",
"/web-app_2_2.dtd",
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN",
"/web-app_2_3.dtd"
};
c. 如果采用Digester 读取xml 文件,可以通过注册解析器的文式将dtd 的访问路径改为文件
Digester.register
例子:
Digester digester = new Digester();
digester.push(this);
digester.setNamespaceAware(true);
digester.setValidating(false);
// Register our local copy of the DTDs that we can find
for (int i = 0; i < registrations.length; i += 2) {
URL url = this.getClass().getResource(registrations[i+1]);
if (url != null)
digester.register(registrations[i], url.toString());
}