为什么与 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 一定有问题吧?但是,从未使用过异常处理程序,因此它的 parsingException 和 errorLevel 属性始终保持为空,导致消息 "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 已成功找到。
我有以下 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 一定有问题吧?但是,从未使用过异常处理程序,因此它的 parsingException 和 errorLevel 属性始终保持为空,导致消息 "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 已成功找到。