Apache Digester Как мне получить некоторый xml, вложенный в тег в виде буквальной строки?

Я анализирую XML с Digester. Часть его содержит содержимое, отформатированное в загадочных элементах псевдо-HTML XML, которые мне нужно преобразовать в PDF. Это будет сделано через Apache FOP. Следовательно, мне нужно получить доступ к элементу xml, который содержит элементы содержимого напрямую, и передать его в FOP. Для этого в Часто задаваемых вопросах по Digester указано, что либо

Оберните вложенный xml в CDATA

or

Если это невозможно сделать, вам нужно использовать NodeCreateRule для создания узла DOM, представляющего тег body и его дочерние элементы, а затем сериализовать этот узел DOM обратно в текст.

Поскольку это сторонний XML, подход CDATA может быть реализован только через (другой) XSLT, что я не решаюсь сделать.

Похоже, эту проблему можно решить с помощью NodeCreateRule, но я не могу понять, как это сделать.

В документации указано, что NodeCreateRule поместит узел в стек, однако я могу заставить его пройти только null.

Я попытался

digester.addRule(docPath + "/contents", new NodeCreateRule());
digester.addCallMethod(docPath + "/contents", "setContentsXML");

setContentsXML ожидает параметр Element.

Я также пробовал это и это безуспешно.

Я использую последнюю стабильную Digester. Был бы признателен за любой совет.

Обновление: я обнаружил ошибку . Результат в моей системе тоже нулевой. Я использую JDK 6u24.


person John Smith    schedule 04.01.2012    source источник


Ответы (1)


Проблема в моем случае, а также связанная ошибка заключается в правильной сериализации файла Element. В моем случае указанное нулевое значение было возвращено не Digester, а Element#toString(). Я предполагаю, что что-то изменилось с JDK 1.4.

На примере ошибки:

result содержит другой (текстовый) узел с фактическим содержимым. Однако toString() просто берет содержимое экземпляра элемента, по которому он вызывается. Дерево элементов должно быть сериализовано явно. Например, с методом сериализации в этом примере использования NodeCreateRule.

Если кто-то еще попытается использовать это с Digester 3: вы необходимо изменить сигнатуру метода SetSerializedNodeRule#end() на SetSerializedNodeRule#end(String, String).

person John Smith    schedule 05.01.2012