Java 不允许实体声明,但允许DTD

Java 不允许实体声明,但允许DTD,java,xml,sax,saxparser,Java,Xml,Sax,Saxparser,我得到了一个XML文档,必须允许该文档具有文档类型声明(DTD),但我们禁止任何实体声明 使用SAXParser.parse()解析XML文档,如下所示: SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setFeature("http://xml.org/sax/features/external-general-entities", false); factory.setFeature("http://x

我得到了一个XML文档,必须允许该文档具有文档类型声明(DTD),但我们禁止任何实体声明

使用
SAXParser.parse()
解析XML文档,如下所示:

SAXParserFactory factory = SAXParserFactory.newInstance();

factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
factory.setValidating(true);

SAXParser parser = factory.newSAXParser();
然后将XML作为
InputSource
传递到解析器中:

InputSource inputSource= ... ;
parser.parse(inputSource, handler);
处理程序
有一个
resolveEntity
方法,该方法调用SAXParser.parse()

public InputSource resolveEntity(String pubID, String sysID) throws SAXException {
  InputSource inputSource = null;
  try {
     inputSource = entityResolver.resolveEntity(publicId, systemId);
  }
  catch (IOException e) {
     throw new SAXException(e);
  }
  return inputSource;
}
当我传入一个包含实体引用的XML文件时,似乎没有对禁止的实体引用执行任何操作(没有抛出异常,也没有剥离任何内容)

下面是我正在使用的坏XML的一个例子。应该允许DTD,但是!不允许使用实体行:

<!DOCTYPE foo SYSTEM "foo.dtd" [
    <!ENTITY gotcha SYSTEM "file:///gotcha.txt"> <!-- This is disallowed-->
]>

<label>&gotcha;</label>

]>
&明白了;

我需要做什么来确保XML中不允许实体引用,但仍然允许DTD?

在SaxParser上设置一个
org.XML.sax.ext.DeclHandler

parser.setProperty("http://xml.org/sax/properties/declaration-handler", myDeclHandler);
解析内部实体声明时会通知DeclHandler。要禁止实体DECL,可以简单地抛出SAXException:

public class MyDeclHandler extends org.xml.sax.ext.DefaultHandler2 {
     public void internalEntityDecl(String name, String value) throws SAXException {
         throw new SAXException("not allowed");
     }
}