Я нахожусь в инкубационной команде Apache JSPWiki и пытаюсь обновить наш проект с JDOM 1.1.2 до JDOM 2.0.5. Кажется, что 98% преобразования работают нормально, но я столкнулся с одной проблемой, которая мешает нам выполнить обновление, связанное с JDOM2 XMLOutputter.outputElementContent(). А именно, мы всегда добавляем инструкцию обработки, чтобы отключить экранирование вывода, но мы по-прежнему ожидаем, что амперсанды и кавычки внутри атрибутов будут экранированы в и . JDOM1 обрабатывает этот PI так, как мы хотим, но JDOM2 интерпретирует эту инструкцию, чтобы также отключить экранирование вывода в пределах значений атрибутов. Я не уверен, является ли это ошибкой/функцией в JDOM2 или JSPWiki неправильно полагается на ошибку/функцию в JDOM1. [1] показывает, как мы настраиваем элемент Format в JSPWiki перед вызовом outputElementContent().
Например, в 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 атрибут AbstractXMLOutputProcessorEscapedEntitiesFilter[3] будет выполнять экранирование только в том случае, если "getEscapeOutput()" имеет значение true, но для getEscapeOutput автоматически устанавливается значение false[4], если установлено PI отключения выхода-экранирования.
Если мы вызовем Format.setIgnoreTrAXEscapingPIs() (или просто не добавим для начала PI с отключенным выводом-экранированием), мы в конечном итоге столкнемся с противоположной проблемой экранирования тега.
Может ли кто-нибудь придумать хорошее/простое решение для нас?
Спасибо, Глен