Apache Camel для обработки кодировки, объявленной в XML-файле
Я пытаюсь проанализировать документ в кодировке UTF-16, используя Apache Camel Splitter с xtokenize, это делегирует Woodstox (com.ctc.wstx.sr.BasicStreamReader), также я не могу знать кодировку файла до того, как прочитал его, в настоящее время некоторые файлы UTF-16, другие UTF-8:
.split().xtokenize(getToken(), 'w', NAMESPACES)
Проблема, с которой я сталкиваюсь, заключается в том, что Camel сообщает Woodstox, какую кодировку использовать:
String charset = IOHelper.getCharsetName(exchange);
Он устанавливает кодировку UTF-8 по умолчанию в качестве кодировки, поэтому BasicStreamReader пытается прочитать байты спецификации как UTF-8 и завершается неудачно с
com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '�' (code 65533 / 0xfffd) in prolog; expected '<'
Как указано в https://www.w3.org/TR/xml/ XML Parser (Woodstox) должен иметь возможность автоматически определять кодировку файла, если только Camel позволяет ему выполнять свою работу.
Есть ли способ не реализовать обнаружение кодирования самостоятельно?
2 ответа
Создан билет Camel JIRA: https://issues.apache.org/jira/browse/CAMEL-11846 Из моих комментариев видно, что не существует простого решения для разделения XML UTF-16 с Camel, не зная заранее, что это UTF-16,
Хотя подкласс XMLTokenExpressionIterator, который является ExpressionAdapter и переключается на InputStream, работает в первую очередь, есть несколько других мест с xslt & xpath & преобразованием в StaxSource, где он сломается по той же причине.
В качестве обходного пути я считаю, что проще позволить XmlStreamReader заранее узнать кодировку (происходит при инициализации) и установить заголовок или свойство Exchange.CHARSET_NAME.
Хорошо, я вижу, что текущий исходный код откатится и будет использовать кодировку платформы. Таким образом, ваш вариант использования с кодировкой, представленной в разделе XML, не поддерживается.
Я не уверен, действительно ли Camel должен использовать стандартную кодировку платформы, поскольку он использует java.util.Scanner
в сплиттере, и он поддерживает сканирование без использования определенной кодировки.
Может быть, вы можете попробовать исправить исходный код в XMLTokenExpressionIterator
и проверить его на месте для вас, и доложить здесь.
Затем мы можем, вероятно, взглянуть на то, чтобы в Apache Camel было необязательно использовать запасную кодировку или нет.
И в вашей текущей версии Apache Camel вы всегда можете расширить XMLTokenExpressionIterator
и переопределить doEvaluate
метод, а затем вызвать createIterator
метод без параметра charset. А затем используйте свой собственный итератор с разветвителем Camel.