【问题标题】:SAX parser does not call startDTDSAX 解析器不调用 startDTD
【发布时间】:2018-09-18 08:51:48
【问题描述】:

我已经关注Obtaining DOCTYPE details using SAX (JDK 7),实现如下:

public class MyXmlReader {

    public static void parse(InputSource inputSource) {
        try {
            XMLReader xmlReader = XMLReaderFactory.createXMLReader();

            MyContentHandler handler = new MyContentHandler(); 
            xmlReader.setContentHandler(handler);
            xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler", handler);    // Does not work; handler is set, but startDTD/endDTD is not called
            xmlReader.setDTDHandler(handler);
            xmlReader.setErrorHandler(new MyErrorHandler());
            xmlReader.setFeature("http://xml.org/sax/features/validation", false);
            xmlReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
            xmlReader.parse(inputSource);
        }
        catch (SAXException e) {
            throw new MyImportException("Error while parsing file", e);
        }
    }
}

MyContentHandler 扩展了 DefaultHandler2,但既不调用 startDTD 也不调用 endDTD(但实际上调用了 startEntity,因此设置了词法处理程序)。 我试图忽略这些功能,但这没有任何改变。

这里出了什么问题? 我正在使用 Java 8 JDK 1.8.0_144。

XML 如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE MyMessage SYSTEM "http://www.testsite.org/mymessage/5.1/reference/international.dtd">
<MyMessage>
    <Header>
    ...

【问题讨论】:

    标签: java sax doctype


    【解决方案1】:

    根据XMLReader API,你需要设置一个DTD Handler,否则DTD Events 将被静默忽略。 DefaultHandler2 还实现了 DTDHandler 接口,所以你可以再次使用xmlReader.setDTDHandler(handler);

    【讨论】:

    • 您能添加一个示例 XML 吗?我在本地验证了您的 Java Snippet 并调用了 startDTD。我使用了以下 XML:&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;img/&gt; &lt;/html&gt;
    • 添加了示例 XML。
    • 对不起,我帮不上忙。您的示例 XML 在我的机器上工作。我的处理程序回调看起来像 public void startDTD(String name, String publicId, String systemId) throws SAXException { System.out.println("start"); } 我还安装了 JDK 1.8.0_144
    • 现在不知怎的。我不知道为什么。使用错误的代码版本或测试数据一定是我的愚蠢错误。谢谢。
    猜你喜欢
    • 2015-08-16
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多