0

我在孵化 Apache JSPWiki 团队并尝试将我们的项目从 JDOM 1.1.2 升级到 JDOM 2.0.5。98% 的转换似乎工作正常,但我遇到了一个阻止我们升级的问题,涉及 JDOM2 的 XMLOutputter.outputElementContent()。也就是说,我们总是添加一个处理指令来禁用输出转义,但我们仍然希望属性中的 & 和引号被转义为 & 和“。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&amp;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 中,AbstractXMLOutputProcessor 的 attributeEscapedEntitiesFilter[3] 只有在“getEscapeOutput()”为真时才会进行转义,但如果设置了 disable-output-escaping PI,getEscapeOutput 会自动设置为 false[4]。

如果我们调用 Format.setIgnoreTrAXEscapingPIs() (或者只是不添加禁用输出转义 PI 开始),我们最终会遇到标签被转义的相反问题。

谁能为我们想出一个好的/简单的解决方案?

谢谢,格伦

[1] http://svn.apache.org/viewvc/incubator/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/render/XHTMLRenderer.java?revision=1486481&view=markup#l56

[2] http://grepcode.com/file/repo1.maven.org/maven2/org.jdom/jdom/1.1/org/jdom/output/XMLOutputter.java#1132

[3] http://grepcode.com/file/repo1.maven.org/maven2/org.jdom/jdom2/2.0.4/org/jdom2/output/support/AbstractXMLOutputProcessor.java#392

[4] http://grepcode.com/file/repo1.maven.org/maven2/org.jdom/jdom2/2.0.4/org/jdom2/output/support/AbstractXMLOutputProcessor.java#665

4

1 回答 1

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

现在工作正常。

于 2013-07-03T16:09:11.337 回答