有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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)进行工作,它应该能够自动检测文件编码

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


共 (2) 个答案

  1. # 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. # 2 楼答案

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

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

    也许您可以尝试在XMLTokenExpressionIterator中修补源代码,并在本地对其进行测试,然后在这里报告

    然后,我们可以看看在ApacheCamel中是否可以选择使用回退编码

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