SAXパーサーはstartDTDからを呼び出すことはありません。

ウーヴェAllner:

私は続いているSAX(JDK 7)を使用して、DOCTYPEの詳細情報を取得、このようにそれを実装します:

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>
    ...
その他のアルバート:

よると、XMLReaderのAPIを使用するには、それ以外のDTDイベントは無視されます、DTDハンドラを設定する必要があります。A DefaultHandler2まだ実装のDTDHandlerインタフェースは、使用できるようxmlReader.setDTDHandler(handler);再び。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=218818&siteId=1