Dom4J сохраняет пробелы при записи файла - PullRequest
4 голосов
/ 17 октября 2011

Я работаю над программой, которая использует Dom4J для записи XML-файлов. Схема базы данных, в которую я пишу, имеет удобную схему проверки и импорта XML. Dom4J работает отлично, но я не могу понять, как установить поле 'preserve' в классе DomWJ XMLWriter. У меня есть конкретный элемент, где мне нужно сохранить закодированные '\ n.

Javadoc для этого класса немного недокументирован http://dom4j.sourceforge.net/dom4j-1.6.1/apidocs/org/dom4j/io/XMLWriter.html

Я пытался поиграться с объектом OutputFormat, но без кубиков.

Может кто-нибудь сказать мне, как обеспечить, чтобы объект XMLWriter сохранял пробелы элементов дерева dom4j при записи в файл.

Спасибо,

Дональд

Скажите, что я начинаю с:

Element accession = factory.createElement("title"); 
List<String> AUT = new ArrayList<String>;
AUT.add("author1");
AUT.add("author2");
String title = "Title";

Я хотел бы иметь вывод, похожий на:

<title>author1
author2
Title</title>

Со строкой возврата, закодированной в поле заголовка.

DefaultEntity e = new DefaultEntity("#10");
if(AUT.size() > 1) {
  for(String a : AUT) {
    accession.addText(a);
    accession.add(e);
  }
accession.addText(title);
}

Это не работает, так как это IllegalAddException.

1 Ответ

3 голосов
/ 18 октября 2011

Прежде всего, свойство «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.

Извините за путаницу.

...