java Apache Camel处理XMLFile中声明的编码
我正在尝试使用带有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中所指定的,如果只有Camel允许XML解析器(Woodstox)进行工作,它应该能够自动检测文件编码
有没有办法不自己实现编码检测
# 1 楼答案
创建了Camel JIRA票据: https://issues.apache.org/jira/browse/CAMEL-11846 从我的评论中,您可以看到,在不事先知道UTF-16的情况下,使用Camel拆分UTF-16XML是不容易的
虽然将XMLTokenExpressionIterator子类化(这是一个ExpressionAdapter)并切换到InputStream首先是可行的,但xslt&;还有其他几个地方可以使用;xpath&;转换到StatxSource,它将因相同原因中断
作为一种解决方案,我认为让XmlStreamReader提前找到编码(发生在初始化)并设置Exchange更容易。字符集\名称标题或属性
# 2 楼答案
好的,我可以看到当前的源代码将回退并使用平台编码。因此,不支持使用XML节中提供的编码的用例
我不确定Camel是否真的需要回退到默认的平台编码,因为它在拆分器中使用了
java.util.Scanner
,并且它支持不使用特定编码的扫描也许您可以尝试在
XMLTokenExpressionIterator
中修补源代码,并在本地对其进行测试,然后在这里报告然后,我们可以看看在ApacheCamel中是否可以选择使用回退编码
在当前版本的ApacheCamel中,您始终可以扩展
XMLTokenExpressionIterator
并重写doEvaluate
方法,然后在不使用字符集参数的情况下调用createIterator
方法。然后将自定义迭代器与Camel拆分器一起使用