Javadoc для org.w3c.dom.Entity
состояний:
XML не требует, чтобы не проверяющий процессор XML считывал и обрабатывал объявления сущностей, сделанные во внешнем подмножестве или объявленные в сущностях параметров. Это означает, что проанализированные объекты, объявленные во внешнем подмножестве, не должны расширяться некоторыми классами приложений, и что текст замены объекта может быть недоступен. Когда текст замены доступен, дочерний список соответствующего узла сущности представляет структуру этого значения замены. В противном случае дочерний список пуст.
Хотя это не относится к объявлениям сущностей, сделанным во внутреннем подмножестве, обязательно должна быть какая-то конфигурация синтаксического анализатора, которая будет считывать и обрабатывать объявления сущностей в любом подмножестве? Действительно, мое чтение документации предполагает, что это по умолчанию.
В любом случае я проверил следующий подход (используя 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?
Без сомнения, я упускаю что-то довольно очевидное; благодарен за ваши мысли.
EDIT
Из ответов до сих пор видно, что моя реализация Xerces работает неправильно. Я постараюсь обновить все библиотеки Xerces до последних версий и, если это решит мою проблему, я закрою этот вопрос. Большое спасибо.
UPDATE
Обновление Xerces действительно решило проблему при условии, что ссылка на сущность находится внутри документа; если это не так, то узел все еще не имеет дочерних элементов. Мне не совсем понятно, почему это так. Благодарен, если кто-то может объяснить, что происходит и / или указать мне, как я могу форсировать создание дочерних узлов без явной ссылки на каждую сущность из документа.