【发布时间】:2015-12-08 03:46:16
【问题描述】:
我有以下 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文件永远不会被解析器认为是“有效的”。我的 XML 一定有问题,对吧?但是,异常处理程序从未使用过,因此其 parsingException 和 errorLevel 属性始终保持为空,从而导致消息 “文档有效”显示在浏览器中。了解为什么会发生这种情况?
P.S.:这是在 Tomcat 实例中运行的。
【问题讨论】:
-
您应该做的第一件事是将
e.printStackTrace()添加到catch块中,以查看究竟是什么出了问题。 -
@JozefChocholacek 我检查了 catalina.out 并找到了问题的根源。我会把它作为答案。