为什么与 Java 7 捆绑在一起的 Java API for XML Processing (JAXP) 不起作用?

Why is the Java API for XML Processing (JAXP) bundled with Java 7 not working?

我有以下 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE starfleet SYSTEM "http://localhost:8080/xml-validate/dtd/starfleet.dtd">
<starfleet>
    <title>The two most famous starships in the fleet</title>
    <starship name="USS Enterprise" sn="NCC-1701">
        <class name="Constitution"/>
        <captain>James Tiberius Kirk</captain>
    </starship>

    <starship name="USS Enterprise" sn="NCC-1701-D">
        <class name="Galaxy"/>
        <captain>Jean-Luc Picard</captain>
    </starship>
</starfleet>

以及以下 DTD:

<!ELEMENT starfleet (title,starship*)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT starship (class,captain)>
<!ATTLIST
    starship name CDATA #REQUIRED
    sn CDATA #REQUIRED>
<!ELEMENT class EMPTY>
<!ATTLIST class name CDATA #REQUIRED>
<!ELEMENT captain (#PCDATA)>

我想通过使用 JAXP 和一个简单的 JSP 文件来解析和验证 XML。

我的 SAX 异常处理程序是:

package myPkg;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXParseException;

public class ParsingExceptionHandler extends DefaultHandler {
    public SAXParseException parsingException = null;
    public String errorLevel = null;

    public void warning(SAXParseException e) {
        errorLevel = "Warning";
        parsingException = e;
    }

    public void error(SAXParseException e) {
        errorLevel = "Error";
        parsingException = e;
    }

    public void fatalError(SAXParseException e) {
        errorLevel = "Fatal error";
        parsingException = e;
    }
}

执行实际验证的JSP文件是:

<%@page language="java" contentType="text/html"%>
<%@page import="javax.xml.parsers.SAXParserFactory"%>
<%@page import="javax.xml.parsers.SAXParser"%>
<%@page import="org.xml.sax.InputSource"%>
<%@page import="org.apache.commons.lang3.StringEscapeUtils"%>
<%@page import="myPkg.ParsingExceptionHandler"%>
<html><head><title>Starfleet validation (SAX - DTD)</title></head><body>
<%
    SAXParserFactory factory = SAXParserFactory.newInstance();
    factory.setValidating(true);
    SAXParser parser = factory.newSAXParser();
    InputSource inputSource = new InputSource("webapps/xml-validate/xml/enterprises.xml");
    ParsingExceptionHandler handler = new ParsingExceptionHandler();

    try {
        parser.parse(inputSource, handler);
    } catch (Exception e) {
        out.println("Something went wrong...");
    }

    if (handler.errorLevel == null) {
        out.println("The document is valid.");
    } else {
        out.println(
            "*** Validation " + handler.errorLevel + ": "
            + StringEscapeUtils.escapeHtml4(handler.parsingException.toString())
        );
    }
%>
</body></html>

问题是无论我做什么,代码的catch部分都会被输入,这意味着我的XML文件永远不会被视为"valid" 由解析器。我的 XML 一定有问题吧?但是,从未使用过异常处理程序,因此它的 parsingExceptionerrorLevel 属性始终保持为空,导致消息 "The document is valid" 在浏览器中显示。对为什么会发生这种情况有任何见解吗?

P.S.: 这是 Tomcat 实例中的 运行。

显然,我在 JSP 文件中用来引用 XML 文件位置的路径不正确。

我输入了:

InputSource inputSource = new InputSource("webapps/xml-validate/xml/enterprises.xml");

错误地假设此相对路径将解析为 Tomcat 的安装目录...但 Tomcat 实际上解析了它(在我的计算机上 运行 OS X ) 至:

~/dev/apache-tomcat/bin/webapps/xml-validate/xml/enterprises.xml

注意上面bin目录的介绍

所以,我所要做的就是将给定路径更改为:

InputSource inputSource = new InputSource("../webapps/xml-validate/xml/enterprises.xml");

并且 XML 已成功找到。