SAX 解析器不调用 startDTD
SAX parser does not call startDTD
我已经关注了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>
...
根据XMLReader API,您需要设置一个 DTD 处理程序,否则 DTD 事件将被静默忽略。 DefaultHandler2
还实现了 DTDHandler 接口,因此您可以再次使用 xmlReader.setDTDHandler(handler);
;
我已经关注了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>
...
根据XMLReader API,您需要设置一个 DTD 处理程序,否则 DTD 事件将被静默忽略。 DefaultHandler2
还实现了 DTDHandler 接口,因此您可以再次使用 xmlReader.setDTDHandler(handler);
;