Apache Digester Как получить XML, вложенный в тег в виде литеральной строки? - PullRequest
0 голосов
/ 04 января 2012

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

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

или

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

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

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

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

Я пытался

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

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

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

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

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

1 Ответ

0 голосов
/ 05 января 2012

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

В примере с ошибкой:

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

В случае, если кто-то другой попытается использовать , что с Digester 3: вы должны изменитьподпись метода SetSerializedNodeRule#end() до SetSerializedNodeRule#end(String, String).

...