【发布时间】:2011-01-26 21:42:55
【问题描述】:
我正在解析(很多)包含我事先不知道的实体引用的 XML 文件(无法改变这一事实)。
例如:
xml = "<tag>I'm content with &funny; &entity; &references;.</tag>"
当我尝试使用以下代码解析时:
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
final DocumentBuilder db = dbf.newDocumentBuilder();
final InputSource is = new InputSource(new StringReader(xml));
final Document d = db.parse(is);
我得到以下异常:
org.xml.sax.SAXParseException: The entity "funny" was referenced, but not declared.
但是,我想要实现的是,解析器将每个未声明的实体(解析器未知)替换为空字符串“”。 或者更好的是,有没有办法将映射传递给解析器,例如:
Map<String,String> entityMapping = ...
entityMapping.put("funny","very");
entityMapping.put("entity","important");
entityMapping.put("references","stuff");
这样我就可以做到以下几点:
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
final DocumentBuilder db = dbf.newDocumentBuilder();
final InputSource is = new InputSource(new StringReader(xml));
db.setEntityResolver(entityMapping);
final Document d = db.parse(is);
如果我会使用此示例代码从文档中获取文本,我应该会收到:
I'm content with very important stuff.
有什么建议吗?当然,我已经很乐意用空字符串替换未知实体。
谢谢,
【问题讨论】:
-
我对 SAX 工具包不够熟悉,无法了解它的 API,但可以想象它有一个与之关联的
...Resolver。此类将负责解析这些引用。这就是 .Net 模型的工作原理。我认为这些概念大致相同。 -
你的意思是像EntityResolver?这听起来确实应该有效,但是当我查看它的 API 时,它似乎并不完全针对这种实体。但是尝试它应该不会造成任何伤害。
-
EntityResolver用于解析外部实体(例如DTD),但我们正在寻找能够处理内部实体的东西。跨度> -
无法 EntityResolver2 通过 InputSource resolveEntity(String name, String publicId, String baseURI, String systemId) 做到这一点?