我正在使用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参数。
我正在使用最新的稳定Digester。感谢任何建议。
更新 我found the bug。我的系统上的结果也是null。我使用的是JDK 6u24
答案 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)
。