Member 12655706 Ответов: 1

Java-код (SAX parser ) ведет себя по-разному в windows и UNIX почему ?


Привет,

Проблема -- & gt; На самом деле я столкнулся с проблемой синтаксического анализа xml (SAX Parser) в Unix-машине. Один и тот же Jar/Java-код ведет себя по-разному на машинах windows и Unix, почему ? :(

Windows Machine -- & gt; отлично работает, используя Sax Parser для загрузки огромного xml-файла, правильного чтения всех значений и заполнения одних и тех же значений. Charset. defaultCharset () windows-1252

Unix Machine -- & gt; После этого создал JAR и развернул в Unix -- & gt; tomcat и выполнил jar.
Попытался загрузить тот же огромный xml-файл, но заметил, что некоторые значения или символы заполняются пустыми или неполными, например
Название страны, населенной, как "ЯСИА" вместо "Малайзия" или дата проводки заполнение а "3 часов" вместо "18/09/2016 03:31:23 часов". Charset. defaultCharset () UTF-8

Проблема только с Unix, потому что, когда я загружаю тот же xml в windows или моем локальном eclipse, он работает нормально, и все значения заполняются правильно.

Кроме того, я попытался изменить свой код и установить кодировку как UTF-8 для inputSteamReader, но все равно он не читает значение правильно в Unix box.

Примечание: в xml нет специальных символов. Также заметил одну вещь, что когда я вынимаю те же записи (те значения, которые не заполнены правильно) в другой xml-файл и загружаю в unix-машину с тем же jar, он работает нормально. Это означает, что проблемы возникают при загрузке этих записей с огромными данными. :(

Пожалуйста, предложите, каким должно быть решение ?

Что я уже пробовал:

Я изменил кодировку на UTF-8, но до сих пор проблема не решена.

Richard MacCutchan

Скорее всего, в вашем коде есть ошибка. Вам нужно сделать некоторую отладку.

Member 12655706

public static void parseXmlDocument(String inputFilePath, обработчик ImplDefaultHandler) {
logger.info("начало: ImplBEUtils.parseXmlDocument() метод ");
SAXParserFactory saxParserFactory = SAXParserFactory. newInstance();
пробовать {
SAXParser saxParser = saxParserFactory.newSAXParser();
InputStream inputStream= новый FileInputStream(inputFilePath);
Reader reader = new InputStreamReader(inputStream, " UTF-8");
Методы фабрики имеет = новые методы фабрики(читатель);
is. setEncoding ("UTF-8");
saxparser.parse(is,(DefaultHandler) обработчик);
// saxParser.parse(новый файл(inputFilePath),(DefaultHandler) обработчик);
} catch (ParserConfigurationException e) {
System. out. println ("ошибка ParserConfig");
е.печатные();
} catch (SAXException e) {
Системы.из.код println("saxexception не : XML не хорошо сформированы");
е.печатные();
} catch (IOException e) {
Системы.из.код println("ошибка ввода-вывода ");
е.печатные();
}
logger.info("конец: ImplBEUtils.parseXmlDocument() метод ");
}


общественного недействительными endElement(строка s, строки S1, строковый элемент) бросает saxexception не {
if (element. equalsIgnoreCase ("transactionDate")) { obj.setTransactionDate(tmpValue); }
}

общественного недействительными символов(char[] ас, я инт, инт Дж) бросает saxexception не { символы.добавить(ас, I и J); tmpValue = новая строка(ас, I и J).отделка(); }

Member 12655706

Я опубликовал код, я не мог понять, есть ли ошибка в коде, то он должен был вести себя так же и в windows. Но в windows он прекрасно работает. :(
Проблема только с unix / docker машиной.
Может ли u pls предложить, если что-то не так в коде?

1 Ответов

Рейтинг:
5

Member 12655706

After modify the code as below it worked fine...

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