簡體   English   中英

Apache Camel處理XML文件中聲明的編碼

[英]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解析器(Woodstox)應該能夠自動檢測文件編碼。

有沒有辦法自己不執行編碼檢測?

好的,我可以看到當前的源代碼將回退並使用平台編碼。 因此,不支持您的用例以及XML節中提供的編碼。

我不確定Camel是否真的需要回退到默認平台編碼,因為它在拆分器中使用java.util.Scanner ,並且它支持不使用特定編碼的掃描。

也許您可以嘗試在XMLTokenExpressionIterator修補源代碼,並在本地為您進行測試,然后在此處進行報告。

然后,我們可能會看一下它是否在Apache Camel中成為可選項,以使用或不使用后備編碼。

並且在當前版本的Apache Camel中,您始終可以擴展XMLTokenExpressionIterator並覆蓋doEvaluate方法,然后在不使用charset參數的情況下調用createIterator方法。 然后將您的自定義迭代器與Camel拆分器一起使用。

創建了駱駝JIRA票證: https : //issues.apache.org/jira/browse/CAMEL-11846從我的評論中您可以看到,使用Camel拆分UTF-16 XML並沒有預先知道它是UTF-16的簡單解決方案。

盡管首先將XMLTokenExpressionIterator子類化,這是一個ExpressionAdapter並切換到InputStream,但在其他幾個地方,由於相同的原因,xslt&xpath並轉換為StaxSource會中斷。

作為一種解決方法,我認為讓XmlStreamReader預先找出編碼(在初始化時發生)並設置Exchange.CHARSET_NAME標頭或屬性會更容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM