Java SAX解析器不调用startDTD

Java SAX解析器不调用startDTD,java,sax,doctype,Java,Sax,Doctype,我遵循了这一点,并按照如下方式实施: public class MyXmlReader { public static void parse(InputSource inputSource) { try { XMLReader xmlReader = XMLReaderFactory.createXMLReader(); MyContentHandler handler = new MyContentHandler();

我遵循了这一点,并按照如下方式实施:

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);
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE MyMessage SYSTEM "http://www.testsite.org/mymessage/5.1/reference/international.dtd">
<MyMessage>
    <Header>
    ...
MyContentHandler扩展了DefaultHandler2,但既没有调用startDTD也没有调用endDTD(例如,实际上调用了Startenty,因此设置了词法处理程序)。 我曾试图省略这些功能,但这并没有改变什么

这里出了什么问题? 我正在使用Java8JDK1.8.0_144

XML如下所示:

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);
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE MyMessage SYSTEM "http://www.testsite.org/mymessage/5.1/reference/international.dtd">
<MyMessage>
    <Header>
    ...

...

根据需要设置DTD处理程序,否则DTD事件将被静默忽略。
DefaultHandler2
还实现了DTDHandler接口,所以您可以使用
xmlReader.setDTDHandler(handler)再次

您能添加一个示例XML吗?我在本地验证了您的Java代码段,并调用了startDTD。我使用了以下XML:
添加了示例XML。对不起,我在这里帮不上忙。您的示例XML在我的机器上运行。我的处理程序回调看起来像
public void startDTD(String name,String publicId,String systemId)抛出SAXException{System.out.println(“start”);}
我还安装了JDK 1.8.0144它现在可以正常工作了。我不知道为什么。一定是我犯了一个愚蠢的错误,使用了错误的代码版本或测试数据。谢谢