Apache Camel 处理 XML-File 中声明的编码

Apache Camel to handle encoding declared in XML-File

我正在尝试使用带有 xtokenize 的 Apache Camel Splitter 解析 UTF-16 编码的文档,这委托给 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 尝试将 BOM 字节读取为 UTF-8,但失败并显示

com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '�' (code 65533 / 0xfffd) in prolog; expected '<'

https://www.w3.org/TR/xml/#sec-guessing 中所述 XML 解析器 (Woodstox) 应该能够自动检测文件编码,如果只有 Camel 让其完成工作的话。

有没有办法不自己实现编码检测?

好的,我可以看到当前源代码将回退并使用平台编码。因此,不支持使用 XML 节中提供的编码的用例。

我不确定 Camel 是否真的需要回退到默认平台编码,因为它在拆分器中使用 java.util.Scanner,并且它支持不使用特定编码的扫描。

也许您可以尝试在 XMLTokenExpressionIterator 中修补源代码并在本地为您测试,并在此报告。

然后我们可能会看看在 Apache Camel 中是否使用回退编码是可选的。

并且在您当前的 Apache Camel 版本中,您始终可以扩展 XMLTokenExpressionIterator 并覆盖 doEvaluate 方法,然后在不使用字符集参数的情况下调用 createIterator 方法。然后将您的自定义迭代器与 Camel 拆分器一起使用。

创建了 Camel JIRA 票证: https://issues.apache.org/jira/browse/CAMEL-11846 从我的评论中,您可以看到没有简单的解决方案可以在事先不知道它是 UTF-16 的情况下将 UTF-16 XML 与 Camel 分开。

虽然子类化 XMLTokenExpressionIterator(它是一个 ExpressionAdapter)并首先切换到 InputStream 是可行的,但还有其他几个地方使用 xslt 和 xpath 并转换为 StaxSource 时会因同样的原因而中断。

作为一种解决方法,我认为让 XmlStreamReader 提前找出编码(发生在初始化时)并设置 Exchange.CHARSET_NAME header 或 属性.

会更容易