java - Apache Camel 处理 XML 文件中声明的编码

标签 java xml-parsing apache-camel xml-encoding

我正在尝试使用 Apache Camel Splitter 和 xtokenize 解析 UTF-16 编码文档,这委托(delegate)给 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 splitter 一起使用。

关于java - Apache Camel 处理 XML 文件中声明的编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46322376/

相关文章:

java - 如何从代码完成中隐藏所有 java.lang.Object 方法?

java - 解析 Soap Service 对 Retrofit 的使用我在响应中的类信封模型中面临这样的异常(即)不匹配的主体模型

grails - 提取码头组件路线的url参数

java - 所有具有完成文件的 Xml 文件的 Camel 路线

java - 如何在android studio中使用Java将数据对象列表作为接口(interface)传递?

java - 什么时候拥有多个 Play 应用程序而不是一个单一的应用程序是有益的?

java - 点击(160.0,120.0)无法完成! (java.lang.SecurityException : Injecting to another application requires INJECT_EVENTS permission)

java - 为什么 org.w3c.dom 解析我的 xml 是错误的?

java - 从互联网解析 xml(年份)

java - 重写 Camel 和 log4j