【发布时间】:2011-09-01 05:44:25
【问题描述】:
org.w3c.dom.Entity 的 Javadoc 声明:
XML 不强制非验证 XML 处理器读取和处理在外部子集中或在参数实体中声明的实体声明。这意味着在外部子集中声明的解析实体不需要由某些类的应用程序扩展,并且实体的替换文本可能不可用。当replacement text 可用时,对应的Entity 节点的子列表代表了那个替换值的结构。否则,子列表为空。
虽然它没有引用内部子集中的实体声明,但肯定有一些解析器配置可以读取和处理任一子集中的实体声明?事实上,我对文档的阅读表明这是默认设置。
无论如何,我已经针对已在内部子集(如图所示)和外部子集中声明的实体测试了以下方法(使用 Xerces),但 foo.hasChildNodes() 返回 false(并且 foo.getChildNodes() 返回foo!) 在每种情况下:
// some trivial example XML
String xml = "<!DOCTYPE example [ <!ENTITY foo 'bar'> ]>\n<example/>";
InputStream is = new ByteArrayInputStream(xml.getBytes());
// parse
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
DocumentType docType = builder.parse(is).getDoctype();
// retrieve the entity - works fine
Entity foo = (Entity) docType.getEntities().getNamedItem("foo");
// now how to get the entity's replacement text?
毫无疑问,我遗漏了一些相当明显的东西;感谢您的想法。
编辑
从到目前为止的答案看来,我的 Xerces 实现行为不端。我将尝试将所有 Xerces 库更新到最新版本,如果这解决了我的问题,我将关闭这个问题。非常感谢。
更新
更新 Xerces 确实解决了这个问题,前提是该实体是从文档中引用的;如果不是,则该节点仍然没有子节点。我并不完全清楚为什么会这样。如果有人能解释发生了什么和/或指出我如何在不明确引用文档中的每个实体的情况下强制创建子节点,将不胜感激。
【问题讨论】:
标签: java xml dom entities xerces