Java 不允许实体声明,但允许DTD
我得到了一个XML文档,必须允许该文档具有文档类型声明(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
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");
}
}