我使用Stax解析器解析XML文件,其编码提到encoding =“UTF-16”, 但是这个XML文件的实际内容不是UTF-16。我怎样才能告诉Stax解析器忽略文件中提到的编码并根据内容进行自动检测
答案 0 :(得分:1)
根据您使用的StAX-Parsing的哪种方法(XMLStreamReader
与XMLEventReader
),您可以将编码传递给XMLInputFactory
的create-Method。
如果没有指定,一些StAX实现试图“猜测”实际编码(例如,Weblogic的StAX-Implementation试图这样做),而其他人则会使用JVM的Default-Encoding(System-Property {{1}小心:必须在启动时设置,在运行时没有变化。
如果您想要/必须自己弄清楚编码,您必须自己实现。我必须这样做一次 - 基于我当时的要求,规格和环境 - 最后得到了一点但并不是非常好的试错法,我不得不尝试我系统支持的所有编码。一个接一个,直到我有一个“足够好的比赛”。我还必须非常小心BOMs(字节顺序标记)。
一般来说,我认为XML-Prologue应该保持正确的编码,因为在代码中所做的任何事情都只能是最好的猜测(但是,这个猜测也可以是正确的)。
作为个人说明,这可能是非常错误的,但对我来说效果很好:由于XML主要是输入数据,我坚信GIGO。
答案 1 :(得分:0)
您可以尝试这样的事情:
byte[] byteArray = null;
try {
if (something)) {
byteArray = sourceXMLString.getBytes(Constants.ENCODING_UTF_16);
} else {
byteArray = sourceXMLString.getBytes(Constants.ENCODING_ISO_8859_1);
}
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArray);
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
try {
xmlEventReaderSource = inputFactory.createXMLEventReader(inputStream);
} catch (XMLStreamException e) {
logger.error("ERROR is StAX reader initialization" + e.getLocalizedMessage());
}