DTD加载方式

dtd文件是用于验证xml的正确性的,就是xml所有节点及值都在dtd文件中有所规定,不能超出dtd定义的范围,否则就会出现错误。

1) dtdxml中的定义

    我们首先来看一下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());            
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值