Почему Apache Xerces / Xalan добавляет дополнительные возвраты каретки в мой сериализованный вывод? - PullRequest
7 голосов
/ 11 июня 2011

Я использую Apache Xerces 2.11.0 и Apache Xalan 2.7.1, и у меня возникают проблемы с дополнительными символами возврата каретки в сериализованном XML.

У меня есть этот (псевдо) код:

String myString = ...;
Document doc = ...;

Element item = doc.createElement("item");
item.appendChild(doc.createCDATASection(myString));

Transformer transformer = ...;
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Result result = new StreamResult(stream);
transformer.transform(new DOMSource(document), result);

Теперь myString содержит разрывы строк (\r\n), (на самом деле это данные в кодировке base64), но когда я смотрю на сериализованный вывод, появляются дополнительные \r символы.

Введите:

Line 1 \r\n
Line 2 \r\n
Line 3 \r\n

выход

Line 1 \r\r\n
Line 2 \r\r\n
Line 3 \r\r\n

Если я использую createTextNode вместо createCDATASection, вывод становится еще более интересным:

Line 1 
\r\n
Line 2 
\r\n
Line 3 
\r\n

Дополнительный символ, кажется, вводится во время сериализации, дерево DOM кажется правильным. (Согласно getTextContent())

Почему это происходит? Что я могу сделать, чтобы это исправить?

Ответы [ 3 ]

10 голосов
/ 05 сентября 2012

Я полагаю, у вас есть эта проблема в Windows, а не в Linux / Solaris / Mac. Сериализатор Xalan (org.apache.xml.serializer.ToStream.java) получает разделитель строк, используя System.getProperty («line.separator»). Когда сериализатор записывает \ r \ n, он интерпретирует \ n как конец строки и фактически записывает \ r + lineSeparator = \ r \ r \ n. Хотя это звучит странно, но это не ошибка, см. [1]. Но так как об этом часто сообщалось как об ошибке, было добавлено свойство расширения xalan [2]. Таким образом, вы можете программно установить:

transformer.setOutputProperty("{http://xml.apache.org/xalan}line-separator","\n");

или

<xsl:output xalan:line-separator="&#10;" />

где xalan - это префикс, связанный с URL-адресом "http://xml.apache.org/xalan".

[1] https://issues.apache.org/jira/browse/XALANJ-1660

[2] https://issues.apache.org/jira/browse/XALANJ-2093

1 голос
/ 11 июня 2011

Странно, но попробуйте выполнить transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "no"); сразу после создания преобразователя и посмотрите, что произойдет.

0 голосов
/ 11 июня 2012

Попробуйте использовать Xerces 2.9.0, который протестирован с Xalan 2.7.1. (2.9.0 входит в пакет Xalan)

После того как у меня возникли проблемы с Xerces 2.11.0, я сделал то же самое.

...