SAX-парсер не вызывает startDTD - PullRequest
0 голосов
/ 18 сентября 2018

Я следовал Получение деталей DOCTYPE с использованием 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>
    ...

1 Ответ

0 голосов
/ 18 сентября 2018

В соответствии с XMLReader API вам необходимо установить обработчик DTD, иначе события DTD будут игнорироваться.A DefaultHandler2 все же реализует интерфейс DTDHandler, поэтому вы можете снова использовать xmlReader.setDTDHandler(handler);;

...