Экранирование строки xml в java

Я читаю элементы с разделами CDATA из rss-канала, которые мне нужно преобразовать в действительный xml. Содержимое раздела CDATA в основном представляет собой допустимый xhtml, но иногда в атрибутах (url-адресах) появляются такие символы, как амперсанд.

Я могу использовать .replaceAll("&", "&"), чтобы решить эту проблему, но если немного подумать, может случиться так, что в атрибутах или тексте появятся другие недопустимые символы.

CMS, в которую я импортирую элемент, не будет принимать разделы CDATA без настройки другой конфигурации для содержимого, поэтому мой вопрос: есть ли простой способ экранировать строку только для атрибутов и текста?

Я использую библиотеку jdom для управления xml после импорта.

Изменить: я проверил StringEscapeUtils apache, но это экранирование всей строки. Мне нужно что-то, что будет экранировать только значения атрибутов и текст внутри элементов.


person Karine    schedule 05.09.2012    source источник
comment
.replaceAll("&", "&") испортит все существующие объекты HTML. Например. < станет <.   -  person Duncan Jones    schedule 05.09.2012
comment
см. эту ссылку stackoverflow.com/questions/599634/   -  person yael alfasi    schedule 05.09.2012
comment
Это тоже правда, Дункан. StringEscapeUtils будет экранировать всю строку, и это не совсем то, что я ищу.   -  person Karine    schedule 05.09.2012


Ответы (2)


Apache Commons предоставляет для этого удобные функции: StringEscapeUtils

person Doug    schedule 05.09.2012
comment
Я пробовал это, к сожалению, это ускользает от всей строки, включая ‹›, окружающие элементы. Я ищу что-то, что избегает только значений атрибутов и текста. - person Karine; 05.09.2012

Когда вы используете JDOM, он автоматически корректно экранирует любой контент, который в нем нуждается. Загружена ли ваша CMS с выводом JDOM, или вы используете какую-то другую библиотеку для заполнения CMS...?

По сути, если у вас есть действительный ввод XML и вы используете JDOM (что-то из org.jdom2.output.*) для вывода данных, то у вас всегда будет хороший вывод... так что вы делаете, чтобы сломать вывод?

Рольф

person rolfl    schedule 05.09.2012
comment
CMS загружается с выводом JDOM. Проблема в том, что у меня не всегда есть допустимые входные данные для SaxBuilder, так как значения некоторых атрибутов могут включать неэкранированные амперсанды. - person Karine; 05.09.2012
comment
... в этом случае JDOM будет декодировать эти экранированные символы (или ваш парсер SAX), и то, что вы видите в JDOM, не будет экранировано и будет повторно экранировано при выводе. - person rolfl; 05.09.2012
comment
Не уверен, что я следую за тобой. JDOM SaxBuilder не примет недопустимую (неэкранированные амперсанды) строку XML. - person Karine; 27.09.2012
comment
Точно, XML-анализатор увидит ... во входных данных, а затем декодирует их. JDOM увидит только &, а затем, если вы выведете с помощью JDOM, JDOM затем перекодирует & как в выводе. Теперь давайте посмотрим, переживут ли эти символы систему комментариев StackExchange. - person rolfl; 27.09.2012