【问题标题】:Why is the Java API for XML Processing (JAXP) bundled with Java 7 not working?为什么与 Java 7 捆绑在一起的用于 XML 处理的 Java API (JAXP) 不起作用?
【发布时间】: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 一定有问题,对吧?但是,异常处理程序从未使用过,因此其 parsingExceptionerrorLevel 属性始终保持为空,从而导致消息 “文档有效”显示在浏览器中。了解为什么会发生这种情况?

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

【问题讨论】:

  • 您应该做的第一件事是将e.printStackTrace() 添加到catch 块中,以查看究竟是什么出了问题。
  • @JozefChocholacek 我检查了 catalina.out 并找到了问题的根源。我会把它作为答案。

标签: java xml jsp tomcat sax


【解决方案1】:

显然,我在 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。

【讨论】:

    猜你喜欢
    • 2011-03-05
    • 2023-04-09
    • 2010-12-29
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多