java - 不允许实体声明但允许 DTD

标签 java xml sax saxparser

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

使用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);

并且 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;
}

当我传入带有 ENTITY 引用的 XML 文件时,似乎没有对禁止的 ENTITY 引用执行任何操作(没有抛出异常,也没有删除任何内容)。

这是我正在使用的错误 XML 的示例。应允许 DTD,但应禁止 !ENTITY 行:

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

<label>&gotcha;</label>

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

最佳答案

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

parser.setProperty("http://xml.org/sax/properties/declaration-handler", myDeclHandler);

当解析内部实体声明时,DeclHandler 会收到通知。要禁止实体声明,您可以简单地抛出 SAXException:

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

关于java - 不允许实体声明但允许 DTD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31302912/

相关文章:

Java SAX 解析器进度监控

java - 从 eclipse 运行时,Maven 不会在项目目录中查找 web.xml

java - 构建和配置文件标签中的 Maven antrun 插件

java - Android 将正在进行的通话置于最前面?

java - Websocket 在 playframework 2 中向所有客户端发送数据

asp.net - 如何从 asp.net 网页中的 xml 文件调用节点

php - 创建自定义 XML,然后通过 AJAX 获取该 XML

xml - powershell、xml 和命名空间

xslt - 我可以将 messageListener 添加到 xslt 模板对象吗?

java - 不构建 DOM 的 XML 转换