我正在孵化Apache JSPWiki团队并尝试将我们的项目从JDOM 1.1.2升级到JDOM 2.0.5。 98%的转换似乎工作正常,但我遇到了一个阻止我们升级的问题,涉及JDOM2的XMLOutputter.outputElementContent()。也就是说,我们总是添加一条处理指令来禁用输出转义,但我们仍然期望属性中的&符号和引号被转义为& amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp;和& quot; JDOM1可以根据需要处理此PI,但JDOM2会解释此指令以关闭属性值中的输出转义。我不确定这是否是JDOM2中的错误/功能,或者JSPWiki是否错误地依赖于JDOM1中的错误/功能。 [1]显示了在调用outputElementContent()之前我们如何在JSPWiki中配置Format元素。
例如,在JDOM1中:
<a href="http://www.google.com/?p=a&c=d">Hello</a>
呈现为:
<a href="http://www.google.com/?p=a&c=d">Hello</a> (good, ampersand is escaped)
这是因为在JDOM1中,无论处理指令如何,XMLOutputter.printAttibutes()[2]都会转义属性值。
但在JDOM2中我们得到:
<a href="http://www.google.com/?p=a&c=d">Hello</a> (bad, still an ampersand character)
...因为在JDOM2中,只有当“getEscapeOutput()”为真时,AbstractXMLOutputProcessor的attributeEscapedEntitiesFilter [3]才会进行转义,但如果设置了disable-output-escaping PI,则getEscapeOutput会自动设置为false [4]。
如果我们调用Format.setIgnoreTrAXEscapingPIs()(或者只是不添加disable-output-escaping PI开头),我们最终会遇到标签被转义的相反问题。
有人能为我们想出一个好的/简单的解决方案吗?
谢谢, 格伦
答案 0 :(得分:0)
我提出了一个简单的解决方案:
我创建了AbstractXMLOutputProcessor的子类,并重写了attributeEscapedEntitiesFilter(),以便不再检查输出转义被禁用: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/render/CustomXMLOutputProcessor.java?revision=1499446&view=markup
...然后将其链接到XMLOutputter(第62行): http://svn.apache.org/viewvc/incubator/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/render/XHTMLRenderer.java?revision=1499446&view=markup#l62
现在工作正常。