SAX解析器不会调用startDTD

问题描述 投票:3回答:1

我跟着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个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.