问题 - >实际上我在Unix机器上面临xml解析(SAX Parser)的问题。在Windows和Unix机器上,相同的Jar / Java-Code表现不同,为什么? :(
Windows机器 - >工作正常,使用SAX Parser加载巨大的xml文件,正确读取所有值并填充相同的值。 Charset.defaultCharset()windows-1252
Unix机器 - >之后创建了JAR并在Unix上部署 - > tomcat并执行jar。 试图加载相同的巨大的xml文件但是注意到一些值或字符填充空或不完整 国家名称填充为“ysia”而不是“Malaysia”或交易日期填充为“3 PM”而不是“18/09/2016 03:31:23 PM”。 Charset.defaultCharset()UTF-8
问题只出现在Unix上,因为当我在windows或我的本地eclipse上加载相同的xml时,它工作正常并且所有值都填充正确。
此外,我尝试修改我的代码并将编码设置为输入调试器的UTF-8,但仍然无法在unix框中正确读取值。
注意:xml中没有特殊字符。还注意到一件事,当我在其他xml文件中取出相同的记录(那些值未正确填充)并在具有相同jar的unix机器中加载时它工作正常。这意味着在使用大量数据加载这些记录时会出现问题。 :(
设置代码:
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
try {
SAXParser saxParser = saxParserFactory.newSAXParser();
InputStream inputStream= new FileInputStream(inputFilePath);
Reader reader = new InputStreamReader(inputStream,"UTF-8");
InputSource is = new InputSource(reader);
is.setEncoding("UTF-8");
saxParser.parse(is,(DefaultHandler) handler);
} catch(Exception ex){
ex.printStackTrace();
}
处理程序:
public void characters(char[] ac, int i, int j) throws SAXException {
chars.append(ac, i, j);
tmpValue = new String(ac, i, j).trim();
}
public void endElement(String s, String s1, String element) throws SAXException {
if (element.equalsIgnoreCase("transactionDate")) {
obj.setTransactionDate(tmpValue);
}
}
请建议,解决方案应该是什么?
答案 0 :(得分:0)
如果当前读取缓冲区在元素的中间结束,则对于同一元素,您可能会对characters()
进行两次(或更多次)调用 - 例如,使用" Mala"和#34; ysia" - 而不只是与#34;马来西亚"进行一次通话。在这种情况下,您的代码会覆盖tmpValue
,其中包含" Mala"与" ysia"。要解决此问题,您需要累计多次调用characters()
的内容:
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if(qName.equalsIgnoreCase("customerName")){
chars.setLength(0);
}
tmpValue = null;
}
public void characters(char[] ac, int i, int j) throws SAXException {
chars.append(ac, i, j);
if (tmpValue == null) {
tmpValue = new String(ac, i, j);
} else {
tmpValue += new String(ac, i, j);
}
}
public void endElement(String s, String s1, String element) throws SAXException {
if (element.equalsIgnoreCase("transactionDate") && tmpValue != null) {
obj.setTransactionDate(tmpValue.trim());
}
}