Parsing XML解析器在Unix机器上的行为不同,仅适用于大/大XML文件。同样的代码在windows上也可以正常工作。为什么?

Parsing XML解析器在Unix机器上的行为不同,仅适用于大/大XML文件。同样的代码在windows上也可以正常工作。为什么?,parsing,unix,sax,Parsing,Unix,Sax,问题-->实际上,我在Unix机器中面临xml解析(SAX解析器)的问题。相同的Jar/Java代码在windows和Unix机器上的行为不同,为什么( Windows机器-->工作正常,使用SAX解析器加载巨大的xml文件,正确读取所有值并填充相同的值。Charset.defaultCharset()Windows-1252 Unix机器-->之后创建JAR并部署在Unix-->tomcat上,然后执行JAR。 尝试加载相同的大型xml文件,但注意到某些值或字符填充为空或不完整,如 国家名称填

问题-->实际上,我在Unix机器中面临xml解析(SAX解析器)的问题。相同的Jar/Java代码在windows和Unix机器上的行为不同,为什么(

Windows机器-->工作正常,使用SAX解析器加载巨大的xml文件,正确读取所有值并填充相同的值。Charset.defaultCharset()Windows-1252

Unix机器-->之后创建JAR并部署在Unix-->tomcat上,然后执行JAR。 尝试加载相同的大型xml文件,但注意到某些值或字符填充为空或不完整,如 国家名称填充为“马来西亚”而不是“马来西亚”,交易日期填充为“下午3点”而不是“2016年9月18日03:31:23”。Charset.defaultCharset()UTF-8

问题只出现在Unix上,因为当我在windows或本地eclipse上加载相同的xml时,它工作正常,并且所有值都正确填充

我还试图修改我的代码,并将inputSteamReader的编码设置为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); 
  }
}

请指出,解决方案应该是什么?

< P>如果当前的读缓冲区在一个元素的中间结束,你可能会得到两个(或更多)对同一个元素的<代码>字符()/<代码>的调用,例如一个带有“Mala”和一个“ysia”的调用,而不仅仅是一个带有“马来西亚”的调用。。在这种情况下,您的代码会用“ysia”覆盖包含“Mala”的
tmpValue
。要解决此问题,您需要累积对
characters()的多个调用的内容。


如果当前的读缓冲区终止于一个元素的中间,您可能会得到两个(或多个)对同一个元素的<代码>字符()/<代码>的调用,例如一个带有“Mala”和一个“ysia”的调用,而不是一个带有“马来西亚”的调用。在这种情况下,您的代码覆盖了包含“Mala”的“代码”> tMPaldV<代码>。。要解决此问题,您需要累积对

characters()的多个调用的内容。


您可以显示读取XML的代码吗?随机猜测将要求{InputStream | Reader}.read()读取给定数量的字符,而不是检查返回值…SAXParserFactory SAXParserFactory=SAXParserFactory.newInstance();尝试{SAXParser SAXParser=SAXParserFactory.newSAXParser();InputStream InputStream=新文件InputStream(inputFilePath);Reader Reader=新InputStreamReader(InputStream,“UTF-8”);InputSource is=新InputSource(Reader);is.setEncoding(“UTF-8”);saxParser.parse(is,(DefaultHandler)handler);}catch(异常ex){ex.printStackTrace();}public void characters(char[]ac,int i,int j)抛出SAXException{chars.append(ac,i,j);tmpValue=new String(ac,i,j).trim();}public void endElement(String s,String s1,String element)抛出SAXException{if(element.equalsIgnoreCase(“transactionDate”)){obj.setTransactionDate(tmpValue);}}private String tmpValue;private StringBuilder chars=new StringBuilder();public void startElement(字符串uri、字符串localName、字符串qName、属性)抛出SAXException{if(qName.equalsIgnoreCase)(“customerName”){chars.setLength(0);}}您能显示读取XML的代码吗?随机猜测将要求{InputStream | Reader}.read()读取给定数量的字符--而不是检查返回值…SAXParserFactory SAXParserFactory=SAXParserFactory.newInstance();尝试{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,inti,intj)抛出SAXException{chars.append(ac,i,j);tmpValue=new String(ac,i,j).trim();}public void endElement(String s,String s1,String元素)抛出SAXException{if(element.equalsIgnoreCase(“transactionDate”){obj.setTransactionDate(tmpValue);}}私有字符串tmpValue;私有StringBuilder chars=new StringBuilder();公共void startElement(字符串uri、字符串localName、字符串qName、属性)引发SAXException{if(qName.equalsIgnoreCase(“customerName”){chars.setLength(0);}}}根据您的建议更新代码后,它将连接所有xml字段,如下所示:((“9190626560usahi”)。singh@gmail.comMr.Amitsingh Victort8217198AnritSingaporatean18/09/2016 09:19:50Combl1-11020228899218/09/2016 09:00:00 AM“您是否按照上面的建议将tmp设置为null startElement()?更新:将建议从文本移动到startElement()(添加)非常感谢Stefan:),您真是天才…现在它在unix box上也工作得很好…您是真正的程序员专家…再次感谢:)但我不明白一件事,为什么我以前的代码在windows上运行良好?在按照您的建议更新代码后,它将所有xml字段连接在一起,如下所示:(((“9190626560usahi”)。singh@gmail.comMr.Amitsingh Victort8217198AnritSingaporatean18/09/2016 09:19:50Combl1-11020228899218/09/2016 09:00:00 AM“Do yo
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()); 
  }
}