首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache Camel处理XML-File中声明的编码

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

Stack Overflow用户
提问于 2017-09-20 12:39:34
回答 2查看 1.5K关注 0票数 2

我试图使用带有xtokenize的Apache解析一个UTF-16编码文档,这委托给Woodstox (com.ctc.wstx.sr.BasicStreamReader),而且在读取文件之前我无法知道它的编码,目前有些文件是UTF-16,其他文件是UTF-8:

代码语言:javascript
复制
.split().xtokenize(getToken(), 'w', NAMESPACES)

我遇到的问题是Camel告诉Woodstox使用哪种编码:

代码语言:javascript
复制
String charset = IOHelper.getCharsetName(exchange);

它将默认的UTF-8设置为编码,因此BasicStreamReader尝试将BOM字节读入UTF-8,并在

代码语言:javascript
复制
com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '�' (code 65533 / 0xfffd) in prolog; expected '<'

正如在https://www.w3.org/TR/xml/#sec-guessing中指定的那样,如果只有Camel让Camel来完成工作,那么Woodstox应该能够自动检测文件编码。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-29 18:13:47

根据我的评论创建了一个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头或属性更容易。

票数 0
EN

Stack Overflow用户

发布于 2017-09-21 07:45:56

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

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

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

然后,我们可能会看到,在Apache中,是否可以选择使用回退编码。

在Apache的当前版本中,您始终可以扩展XMLTokenExpressionIterator并重写doEvaluate方法,然后在没有字符集参数的情况下调用createIterator方法。然后使用您的自定义迭代器与骆驼分离器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46322376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档