Apache Digester如何将一些嵌套在标签中的xml作为文字字符串?

时间:2012-01-04 10:21:54

标签: java apache-commons-digester

我正在使用Digester解析XML。它的一部分包含以神秘的伪HTML XML元素格式化的内容,我需要将其转换为PDF。这将通过Apache FOP完成。因此,我需要直接访问包含内容元素的xml元素并将其传递给FOP。为此,Digester FAQ表明其中一个

  

将嵌套的xml包装在CDATA中

  

如果无法做到这一点,那么您需要使用NodeCreateRule来创建表示body标签及其子节点的DOM节点,然后将该DOM节点序列化为文本

由于它是第三方XML,CDATA方法只能通过(另一个)XSLT来完成,我姗姗来迟。

看起来这个问题应该可以通过NodeCreateRule来解决,但我无法弄清楚如何完成它。

文档指出NodeCreateRule会将Node推送到堆栈上,但我只能将它传递给null。

我试过

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

setContentsXML需要一个Element参数。

我也没试过thisthis

我正在使用最新的稳定Digester。感谢任何建议。

更新found the bug。我的系统上的结果也是null。我使用的是JDK 6u24

1 个答案:

答案 0 :(得分:0)

我的案例中的问题以及链接的bug存在于Element的正确序列化中。在我的情况下,提到的空值不是由Digester返回,而是由Element#toString()返回。我假设自JDK 1.4以来发生了一些变化。

通过bug示例:

result包含带有实际内容的另一个(文本)节点。然而,toString()只是将Element实例的内容称为uppon。 元素树必须明确序列化。例如,使用NodeCreateRule的{​​{1}}用例示例中的序列化方法。

如果其他人尝试将this与Digester 3一起使用:您必须将方法签名SetSerializedNodeRule#end()更改为SetSerializedNodeRule#end(String, String)