jdk1.3与jdk1.4以上dtd的规范不一样的。jdk1.3支持2.3规范。1.4版本以上为2.4规范。其差别为开头注释的内容不同。因此需要详细检查你的jdk版本。
2.3规范注释为:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3/  /EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd">
 <web-app>
 ...
 </web-app>2.4规范注释为:
<?xml version="1.0" encoding="UTF-8"?>
 <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 ...
 </web-app>1.4版本以上不能解释2.3规范的dtd。同样1.3也不能解释2.4规范的dtd。

解决方案 »

  1.   

    hendy78(开拓平凡),你好,首先感谢你的回复。
    你给的这个是web.xml文件中的一部分吧,好像和我的问题没太大关系。
    也可能我没明白你的意思,希望能进一步讨论这个问题。我只要在xml里写的是dtd的绝对路径肯定不会出错。
    我想应该是解析器在处理路径时的问题,不知道为什么InputSource的setSystemId()方法不起作用。
      

  2.   

    String str="D:\\放xml\\client.xml";
    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
    DocumentBuilder builder=factory.newDocumentBuilder();
    Document doc=builder.parse(new File(is));
    这样就不错了,因为你转变为FileInputStream,导致DocumentBuilder 根本不知道你的File在哪个目录中,所以无法找到DTD
      

  3.   

    如果你的dtd也是放在D:\\放xml\\目录中,那肯定是没有问题的。不知道你是目录是怎么放的
      

  4.   

    是放在这个目录里的String str="D:\\放xml\\client.xml";
    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
    DocumentBuilder builder=factory.newDocumentBuilder();
    Document doc=builder.parse(new File(is));
    你的代码里最后一行的参数应该是str不是is吧
      

  5.   

    同问
    java解析xml文件时,找不到相对路径的dtd文件?与jdk版本有关系? 小女非常感激
      

  6.   

    若路径中包含中文则报错"java.net.MalformedURLException: no protocol: fclml.dtd这个错误跟jdk没关系  
    应该把要解析的xml转换为stream
    InputStream in=new FileInputStream(filePath);
    dtd的引用  我一般都写绝对路径 还没有发现错误
      

  7.   

    简单的解决办法:
    把DTD和XML放在同于个目录。如果你需要把XML和DTD放在不同的目录, 则需要需要告诉XML解析器到哪里去找DTD. Apache提供一个开源的库来处理这方面的事情,请参考:http://xml.apache.org/commons/components/resolver/