Прежде всего, свойство «preserve» не имеет ничего общего с сохранением кодировки ранее закодированного символа, а скорее с сохранением пробела, содержащегося в элементе. Это свойство обычно контролируется атрибутом xml:space="preserve"
.
Однако, если ваш вариант использования заключается в том, что на вашем входе есть закодированная новая строка, которую вы хотите сохранить на выходе, у вас проблемы. DOM4J будет декодировать все сущности и символьные ссылки на соответствующие им символы Java (UTF-16). Это частично контролируется путем настройки базового XMLreader, но, насколько мне известно, ни один XMLReader не будет сообщать о начале и конце ссылок на символы - они будут молча заменены соответствующими им значениями символов.
При выводе XMLWriter будет кодировать только те символы, которые требуется кодировать, либо из-за правил XML, либо из-за кодировки, используемой при сериализации (например, UTF-8 или ISO-8859-1 и т. Д.).
В этом случае у вас есть два основных варианта.
1) Подкласс XMLWriter и полностью заменяет метод characters (), так как обработка пробелов действительно присуща этому методу. Нет другого способа перехватить ввод табуляции, новой строки или возврата каретки. Здесь вы должны как-то отслеживать, где вы находитесь, и понимать, что вы обрабатываете правильный символ новой строки
2) Определите символ новой строки, который вы хотите «повторно экранировать», и замените его на узел DefaultEntity("#10")
, задав для свойства resolveEntityRefs
для XMLWriter
значение false
. Эта опция подразумевает разделение существующего текстового узла на две части и вставку узла сущности между ними.
Похоже, что вариант 2 включает в себя меньше работы, но при этом громоздкий
UPDATE:
ОК, кажется, вы не можете добавить один и тот же идентичный объект дважды. Если вы добавляете новый экземпляр сущности каждый раз, когда он работает. Тем не менее, ваш случай может быть исправлен добавлением xml:space="preserve"
к вашему элементу.
if (AUT.size() > 1) {
for (String a : AUT) {
accession.addText(a);
accession.addText("\n");
}
accession.addText(title);
}
, а затем
accession.addAttribute(QName.get("space", Namespace.XML_NAMESPACE),
"preserve");
В этом случае ваши явно добавленные разрывы строк должны быть сохранены, независимо от формата вывода, используемого при записи в xml.
Извините за путаницу.