对于大型/大型xml文件,XML Parser在Unix机器上的行为有所不同。相同的代码在Windows上工作正常。为什么?

时间:2016-09-24 10:08:34

标签: parsing unix sax

问题 - >实际上我在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); 
  }
}

请建议,解决方案应该是什么?

1 个答案:

答案 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()); 
  }
}