Как сохранить объявленную кодировку входных данных в выходных данных javax.xml.transform.Transformer.transform?(например, избегайте замены UTF-16 на UTF-8) - PullRequest
5 голосов
/ 31 января 2011

Предполагая этот входной XML

<?xml version="1.0" encoding="UTF-16"?>
<test></test>

Написание этих строк кода:

StreamSource source = new StreamSource(new StringReader(/* the above XML*/));
StringWriter stringWriter = new StringWriter();
StreamResult streamResult = new StreamResult(stringWriter);
TransformerFactory.newInstance().newTransformer().transform(source, streamResult);
return stringWriter.getBuffer().toString();

Выводит для меня этот XML:

<?xml version="1.0" encoding="UTF-8"?>
<test></test>

(объявленная кодировка UTF- 16 преобразуется в стандартную UTF- 8 )

Я знаю, что могу явно запросить вывод UTF-16

transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-16");

Но вопрос в том, как сделать так, чтобы выходная кодировка автоматически совпадала с вводом?

Ответы [ 4 ]

4 голосов
/ 31 января 2011

Для этого вам придется использовать что-то более сложное, чем StreamSource.Например, StAXSource принимает XMLStreamReader, который имеет метод getCharacterEncodingScheme(), который сообщает, какая кодировка используется во входном документе - вы можете установить его в качестве выходного enocding,

2 голосов
/ 02 февраля 2011

попробуйте это:

// Create an XML Stream Reader
XMLStreamReader xmlSR = XMLInputFactory.newInstance()
        .createXMLStreamReader(new StringReader(/* the above XML*/));
// Wrap the XML Stream Reader in a StAXSource
StAXSource source = new StAXSource(xmlSR);
// Create a String Writer
StringWriter stringWriter = new StringWriter();
// Create a Stream Result
StreamResult streamResult = new StreamResult(stringWriter);
// Create a transformer
Transformer transformer = TransformerFactory.newInstance().newTransformer();
// Set STANDALONE based on the source stream
transformer.setOutputProperty(OutputKeys.STANDALONE,
        xmlSR.isStandalone() ? "yes" : "no");
// Set ENCODING based on the source stream
transformer.setOutputProperty(OutputKeys.ENCODING,
        xmlSR.getCharacterEncodingScheme());
// Set VERSION based on the source stream
transformer.setOutputProperty(OutputKeys.VERSION, xmlSR.getVersion());
// Transform the source stream to the out stream
transformer.transform(source, streamResult);
// Print the results
return stringWriter.getBuffer().toString();
1 голос
/ 01 февраля 2011

Процессор XSLT на самом деле не знает, что такое входная кодировка (синтаксический анализатор XML не сообщает об этом, потому что он не должен знать).Вы можете установить выходную кодировку, используя xsl: output, но чтобы сделать ее такой же, как и входную кодировку, вы должны сначала обнаружить входную кодировку, например, посмотрев на исходный файл перед его анализом.

1 голос
/ 31 января 2011

Сначала нужно заглянуть в поток.Раздел F спецификации XML дает представление о том, как автоматически определять кодировку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...